2010-09-14 2 views
3

Я попытался задать вопрос разными способами, проверьте мой профиль на два других вопроса, объясняющих трудности, которые у меня были с подходами, которые я использовал для этого сценария. Я пропущу их здесь.Метод обратного вызова WCF для клиента с возвращаемым значением

Мне просто нужен пример (предпочтительный C#) сервера, который обращается к клиенту (через канал nettcp), клиент вычисляет ответ и возвращает результат.

  • Поток вызовов сервера блокируется до тех пор, пока клиент не отправит ответ.
  • Обратный вызов сервера запрашивается каким-либо событием, например, таймером, а не вызовом клиента.
  • Клиенту не нужно возвращаться на сервер в контексте обратного вызова сервера, поэтому не должно быть проблем с блокировкой.
  • клиент может принимать (и для этого упражнения, следует принять) один или несколько параметров, с помощью которых, чтобы выполнить расчет
  • Клиент может вернуться (и для этого упражнения, должен возвращать) непустое результат
  • Используемый подход должен по крайней мере быть совместимым, если не реализованным, с возможностью обработки нескольких клиентов по очереди, включая функциональность subscribe() и unsubscribe().
  • Это не домашнее задание, это пример того, как создать сервер подписчиков/издателей на основе WCF, который поддерживает (несколько) доверенных клиентов с низкой задержкой между сервером и клиентом без опроса и без металирования сообщений (по сравнению с забор)
  • Я специально НЕ интересуюсь решениями, которые включают (IsOneWay = true), если не станет ясно, что я очень смущен его значением и его последствиями.

Спасибо!

ответ

3

Проверить this article на CodeProject. Это описывает базовый пример обратных вызовов. Мало вещей, которые вы, возможно, придется изменить:

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

  • Когда вызывать обратный вызов, это действительно реализация сервера. В данном примере поддерживается список каналов обратного вызова клиента, когда клиент присоединяется (или подписывается на ваше требование). Теперь этот список можно использовать для вызова обратного вызова любым способом. Таким образом, вы можете вызывать обратные вызовы по таймеру, просто перебирая список. Обратите внимание, что вам необходимо обеспечить поточный доступ к списку.

  • Если клиент должен вернуть некоторый результат в обратном вызове, то снова OneWay не может быть использован.

  • Как упоминалось ранее, подписка означает просто добавление в список (присоединитесь к стороне в примере) и отменить подписку означает удаление из списка (оставить участника).

Edit:

Я взял исходный код из example зрячих и изменила его следующим образом:

добавлен метод Echo в договоре обратного вызова:

public interface IBeerInventoryCallback 
{ 
    ... 

    [OperationContract] 
    string Echo(string message); 
} 

Вызывается Echo из службы, когда кто-то покинул сторону и распечатал ответ от клиента на консоли. И он работал без каких-либо проблем.

Обратите внимание, что в этом примере используется прокси-сервер, созданный с помощью VS, который наследует от System.ServiceModel.DuplexClientBase<T>, что делает клиентский код намного проще. Возможно, вы должны попробовать.

+0

Легче описать IsOneWay = false, чем сделать. –

+0

В чем проблема при не указании атрибута IsOneWay для контракта обратного вызова? – VinayC

+0

Это не работает, насколько я пробовал. [См. Мой пример здесь] (http://stackoverflow.com/questions/3392123/wcf-duplex-callback-sample-failing). Работает ли это для вас? –

Смежные вопросы