Как мне опубликовать только определенный подписчик 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.

Другие вопросы по тегам