Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF подобраться к контракту / 4 сообщений из 4, страница 1 из 1
11.03.2011, 11:18
    #37159189
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF подобраться к контракту
Добрый день.
Начал вчитываться в WCF на примере из MSDN
http://msdn.microsoft.com/ru-RU/library/ms734712

Вроде все получается, дуплексный контракт тоже.
Но появился один интересный вопрос: можно ли, из Shared Sub Main к примеру ( http://msdn.microsoft.com/ru-ru/library/ms730935.aspx пример в конце страницы), попасть в экземпляр класса реализующий контакт?

Например: на сервере регистрируются N клиентов. Есть желание кого-то из клиентов грохнуть. Как это сделать?
...
Рейтинг: 0 / 0
13.03.2011, 11:34
    #37161980
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF подобраться к контракту
для дуплекса всегда SessionMode.Required, с помощью OperationContext.GetCallbackChannel несложно соорудить список клиентских "сессий", например, при регистрации клиента добавлять в этот список CallbackChannel и необходимую информацию о клиенте, SessionId, и проч. (ну а грохнуть - закрыть канал, например)

наверное, как-то можно добраться до клиентских "сессий" штатными средствами, не сооружая своей "городухи", не знаю, не разбирался (т.к. мне нужна была именно моя "городуха")
...
Рейтинг: 0 / 0
13.03.2011, 14:05
    #37162124
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF подобраться к контракту
Можно, если не секрет, взглянуть на Вашу "городуху"?
Может чем пригодится?
...
Рейтинг: 0 / 0
13.03.2011, 15:41
    #37162213
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF подобраться к контракту
Арнис,

сухой остаток схематично такой
Код: 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.
    [ServiceContract(..., CallbackContract = typeof(IDuplexCallbackContract))]
    public interface IDuplexContract
    {
        [OperationContract(...)]
        void Login(Message message);
        [OperationContract(...)]
        void Call(Message message);
        ...
        [OperationContract(...)]
        void Logout(Message message);
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class DuplexService : IDuplexContract
    {
	Dictionary<string, IDuplexCallbackContract> clients ...
        ...
        public void Login(Message message) // регистрация клиента
        {
	   ...
           lock (((ICollection)clients).SyncRoot) {
		clients.Add(OperationContext.Current.Channel.SessionId, OperationContext.Current.GetCallbackChannel<IDuplexCallbackContract>());
           }
	   ...
        ...
        public void Call(Message message) // клиент дергает сервис
        {
           string sessionId = OperationContext.Current.Channel.SessionId;
	   IDuplexCallbackContract ch = null;
           lock (((ICollection)clients).SyncRoot) { // находим "сессию" клиента
                if (clients.ContainsKey(sessionId)) {
                    ch = clients[sessionId];
                }
           }
           if (ch != null) { // работаем с каналом клиента
	   ...
только в clients вместо IDuplexCallbackContract я засовываю класс-обертку (напихивая всякой дребеденью)
чтобы поддерживать актуальность списка, можно либо подписаться на OperationContext.Current.Channel.Closing/Faulted, либо периодически запускать "чистильщика дохлых сессий"
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF подобраться к контракту / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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