Гость
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Идентификация клиента в Remoting / 5 сообщений из 5, страница 1 из 1
11.10.2005, 18:21
    #33318239
Идентификация клиента в Remoting
Здравствуйте.

Есть задача - в теле метода remoting-объекта определить, что его (этот метод) в данный момент вызвал такой-то клиент (ну, например, получить какой-то уникальный идентификатор в пределах процесса сервера).

Допустим, есть класс, унаследованный от MarshalByRef:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
public class C1 : MarshalByRefObject
{
  public void f()
  {
     // вот здесь нужно определить
     // какой клиент вызывал этот метод
  }
}

Как реализовать сабж?
...
Рейтинг: 0 / 0
11.10.2005, 18:27
    #33318258
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификация клиента в Remoting
Денис ПетровКак реализовать сабж?

Так, вроде, работало: CurrentUser.getUserFullName();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
using System;
using System.DirectoryServices;
using System.Security.Principal; 
using System.Threading;  
using System.Web;
namespace IntoolsRev
{
	/// <summary>
	/// Summary description for User.
	/// </summary>
	abstract class CurrentUser
	{
		public static string getUserFullName()
		{
			WindowsPrincipal p = Thread.CurrentPrincipal as WindowsPrincipal;
			return GetFullName(p.Identity.Name);
		}
		private static string GetFullName(string strLogin)
		{
			string str = "";
			// Parse the string to check if domain name is present.
			int idx = strLogin.IndexOf('\\');
			if (idx == -1)
			{
				idx = strLogin.IndexOf('@');
			}

			string strDomain;
			string strName;

			if (idx != -1)
			{
				strDomain = strLogin.Substring(0, idx);
				strName = strLogin.Substring(idx+1);
			}
			else
			{
				strDomain = Environment.MachineName;
				strName = strLogin;
			}

			DirectoryEntry obDirEntry = null;
			try
			{
				obDirEntry = new DirectoryEntry("WinNT://" + strDomain + "/" + strName);
				System.DirectoryServices.PropertyCollection  coll = obDirEntry.Properties;
				object obVal = coll["FullName"].Value;
				str = obVal.ToString();
			}
			catch (Exception)
			{
				str = "";
				
			}
			return str;
		}			
	}
}
...
Рейтинг: 0 / 0
11.10.2005, 18:41
    #33318284
Идентификация клиента в Remoting
Хм... здесь же вроде все основано на определении полного имени пользователя?
А если клиенты выполняются на той же машине, что и сервер? И под той же учетной записью?

Мож я что-то не понимаю... но, кажется, в таком случае это не работает.
...
Рейтинг: 0 / 0
11.10.2005, 20:20
    #33318444
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идентификация клиента в Remoting
Денис ПетровХм... здесь же вроде все основано на определении полного имени пользователя?
А если клиенты выполняются на той же машине, что и сервер? И под той же учетной записью?

Мож я что-то не понимаю... но, кажется, в таком случае это не работает.

Возвращается имя пользователя домена через AD, если установлено.
А так netbios имя. А что нужно?
...
Рейтинг: 0 / 0
11.10.2005, 21:52
    #33318514
Идентификация клиента в Remoting
Есть сервис, выполняющий роль remoting-сервера. К нему могут подключаться клиенты как с других машин сети, так и с той же, на которой он работает.

Требуется получить возможность в некоторых методах remoting-объекта определять, какой именно из клиентов этот метод вызвал. Требуется некий уникальный в пределах этого процесса (имеется ввиду сервис) идентификатор клиента.

Нужно это для реализации следующей штуки. Есть объект-синглтон:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class SingletoneSample : MarshalByRefObject, ISingletoneSample
{
    public bool Lock()
    {
       // захватываем объект
       // здесь нужно определить, что за клиент вызывает этот метод
    }

    public bool UnLock()
    {
       // освобождаем объект
       // здесь тоже нужно определить, что за клиент вызывает этот метод
    }

    public void SomeAction()
    {
        // здесь выполняем какие-то действия
    }
}

Remoting-сервер создает этот синглтон. Очередной клиент, прежде, чем вызвать метод SomeAction, вызывает Lock. В методе Lock синглтон проверяет - если он не захвачен никем, то запоминает клиента по его идентификатору и переходит в состояние "захвачен". Если он уже в этом состоянии, то он возвращает false, и клиент не имеет права в этом случае вызывать SomeAction.

Клиент, "захвативший" синглтон ранее, освобождает его с пмощью UnLock.
Т. е., нечто вроде распределенной критической секции, если уместна такая аналогия.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class ClientClass
{
    void foo()
    {
        // получаем ссылку на синглтон через активатор
        ISingletoneSample sample = ...

        if (sample.Lock())
        {
             try
             {
                 sample.SomeAction();
             }
             finally
             {
                 sample.UnLock();
             }
        }
    }
}
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Идентификация клиента в Remoting / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]