Метод обратного вызова WCF между серверами и возвращаемое значение - PullRequest
3 голосов
/ 15 сентября 2010

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

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

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

Спасибо!

1 Ответ

3 голосов
/ 15 сентября 2010

Отметьте эту статью на CodeProject. Это описывает базовый пример обратных вызовов. Немного вещей, которые вам, возможно, придется изменить:

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

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

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

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

Редактировать :

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

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

public interface IBeerInventoryCallback
{
   ...

    [OperationContract]
    string Echo(string message);
}

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

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

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