WCF percall и один экземпляр - PullRequest
       1

WCF percall и один экземпляр

0 голосов
/ 08 декабря 2010


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

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Reentrant)]

Я хочу использовать один экземпляр, но он не будет работать.
Он запускает все события для последнего подписанного клиента.
Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 08 декабря 2010

Образец имеет InstanceContextMode.PerSession, а не InstanceContextMode.PerCall. Каждый подписанный клиент связан с отдельным экземпляром MyService. Каждый из этих экземпляров имеет поле члена _callbackInstance, которое содержит ссылку на канал обратного вызова его конкретного клиента. Все экземпляры MyService связаны со «комнатой чата» через статическое событие Broadcast, и когда конкретный клиент что-то говорит, код выполняет итерацию по списку вызовов статического события для передачи каждому подписанному клиенту.

Если вы сделаете MyService синглтоном, _callbackInstance будет содержать только канал обратного вызова последнего подписанного клиента, поэтому вы видите описанное вами поведение.

Для того чтобы класс обслуживания работал правильно как одноэлементный экземпляр, вам необходимо заменить _callbackInstance на коллекцию, содержащую все каналы обратного вызова для подписанных клиентов, и самостоятельно управлять добавлением и удалением из этой коллекции в качестве клиентов. прибыл и ушел. Вещание будет включать повторение этой коллекции. Недостаток этого подхода заключается в том, что несколько клиентов могут вызывать службу одновременно, и поэтому вам необходимо явно синхронизировать доступ к членам класса, чтобы обеспечить безопасность потоков и правильное поведение.

2 голосов
/ 08 декабря 2010

Благодаря Крису, я нашел этот пример, показывающий, как обрабатывать несколько подписчиков обратного вызова при использовании InstanceContextMode.Single.
Пример, показывающий, как управлять словарем (список также возможен) каналов обратного вызова,Игаль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...