powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Идентификация клиента в Remoting
5 сообщений из 5, страница 1 из 1
Идентификация клиента в Remoting
    #33318239
Здравствуйте.

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

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

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

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

Так, вроде, работало: 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
Идентификация клиента в Remoting
    #33318284
Хм... здесь же вроде все основано на определении полного имени пользователя?
А если клиенты выполняются на той же машине, что и сервер? И под той же учетной записью?

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

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

Возвращается имя пользователя домена через AD, если установлено.
А так netbios имя. А что нужно?
...
Рейтинг: 0 / 0
Идентификация клиента в Remoting
    #33318514
Есть сервис, выполняющий роль 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
5 сообщений из 5, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Идентификация клиента в Remoting
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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