Как мне опубликовать только определенный подписчик ServiceModelEx?
Итак, я изменяю способ, которым мой сервис отправляет уведомления клиентам. В настоящее время ServiceModelEx работает так, что если какой-либо клиент подписан на событие, он отправляет сообщения всем подписанным пользователям независимо от того, предназначено ли это сообщение для них. На клиенте я определяю, является ли сообщение для них. Как вы можете себе представить, это может генерировать много сетевого трафика, особенно когда вам нужно только отправить определенным клиентам.
Щас пользуюсь TransientSubscriptions
,
Я попытался отладить код, но единственное, что я могу сказать, это то, что каждый подписчик хранится как некий тип Generic. CallbackChannel
,
Каждый TransientSubscriber определяется таким образом.
T subscriber = OperationContext.Current.GetCallbackChannel<T>();
Когда он добавляет TransientSubscriber, он выполняет это.
static void AddTransient(T subscriber, string eventOperation) {
lock (typeof(SubscriptionManager<T>)) {
List<T> list = m_TransientStore[eventOperation];
if (list.Contains(subscriber)) {
return;
}
list.Add(subscriber);
}
}
Если есть лучший способ, тогда я открыт для предложений. Я просто хочу отправить уведомление одному клиенту вместо всех клиентов.
Также вот статья msdn на ServiceModelEx.
2 ответа
Итак, вот что я сделал. Я добавил еще один универсальный класс, но он содержит userID и Generic CallbackChannel.
public class Subscriber<T> {
private int _UserID;
private T _Subscription;
public int UserID {
get { return _UserID; }
set { _UserID = value; }
}
public T Subscription {
get { return _Subscription; }
set { _Subscription = value; }
}
}
Затем я переключил каждый параметр в ServiceModelEx, который содержал T для хранения Subscriber<T>
, После этого я создал новый FireEvent
называется FireUserEvent
который затем передает идентификатор пользователя через GetTransientList
методы, которые я также создал новые для передачи в UserID. Таким образом, он только возвращает Subscriber<T>
для указанного пользователя.
Вы не делаете (Юваль явно рекомендует не делать этого). Цель паба / саба состоит в том, что события отправляются всем подписчикам. Вы никогда не должны фильтровать, кто их получает. Это утилиты, в которых нет бизнес-логики. Как только вы начнете добавлять фильтрацию, вы рискуете спуститься вниз по кроличьей норе, соединяющей изменчивую бизнес-логику с вашей утилитой.
Если есть клиенты, которые должны получать определенные события, почему они подписаны на них? Возможно, вы объединяете слишком много типов событий в один паб / субконтракт. Вы можете решить эту проблему, разделив ваши события на несколько контрактов, хотя при использовании паба / подпункта ServiceModelEx вам потребуется использовать несколько пабов / подпунктов. Вы можете решить эту проблему, создав паб / подпункт маршрутизации сообщений, используя Action="*", как показано в следующем примере: http://blogs.microsoft.co.il/sasha/2008/03/15/wcf-router-and-publishsubscribe-sample-implementation/
В качестве альтернативы, если вы хотите предоставить событие назад конкретному абоненту, вы должны использовать другой механизм. Например, ServiceModelEx также предоставляет то, что называется службой ответа, выполните поиск "службы ответа" по адресу: http://idesign.net/downloads.