Отметьте эту статью на CodeProject. Это описывает базовый пример обратных вызовов. Немного вещей, которые вам, возможно, придется изменить:
В контракте обратного вызова операции помечены как односторонние - это предотвращение блокировки сервера из-за плохого клиента (рекомендуется). Но если вам нужно заблокировать сервер, то вам нужно удалить один из способов. Обратите внимание, что если вы собираетесь отозвать несколько клиентов один за другим, то вам, возможно, придется отозвать каждого из них в другом потоке, в противном случае первый клиент заблокирует обратный вызов следующему клиенту.
Когда вызывать обратный вызов, это действительно реализация сервера. Данный пример поддерживает список каналов обратного вызова клиента, когда клиент присоединяется (или подписывается по вашему требованию). Теперь этот список можно использовать для вызова обратного вызова любым удобным для вас способом. Таким образом, вы можете вызывать обратные вызовы по таймеру, просто перебирая список. Обратите внимание, что вы должны обеспечить многопоточный доступ к списку.
Если клиент должен вернуть какой-то результат в обратном вызове, то снова OneWay использовать нельзя.
Как упоминалось ранее, подписка означает простое добавление в список (например, присоединение к группе), а отмена подписки - удаление из списка (выход из партии).
Редактировать :
Я взял исходный код из примера прицела и изменил его следующим образом:
Добавлен метод Echo
в контракте обратного вызова:
public interface IBeerInventoryCallback
{
...
[OperationContract]
string Echo(string message);
}
Вызывает Echo из сервиса, когда кто-то покидает вечеринку и печатает ответ от клиента на консоли. И это работало без каких-либо проблем.
Обратите внимание, что в этом примере используется клиентский прокси, сгенерированный VS, который наследуется от System.ServiceModel.DuplexClientBase<T>
, что значительно упрощает код клиента. Возможно, вам стоит попробовать.