首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅发布到特定的订阅者ServiceModelEx?

如何仅发布到特定的订阅者ServiceModelEx?
EN

Stack Overflow用户
提问于 2012-12-13 06:14:32
回答 2查看 172关注 0票数 0

好了,我改变了我的服务向客户端推送通知的方式。目前,ServiceModelEx的工作方式是,如果任何客户端订阅了某个事件,它都会向所有订阅的用户发送消息,而不管该消息是否针对他们。在客户端,我确定消息是否是给他们的。正如您可以想象的那样,这会产生大量的网络流量,特别是当您只需要发送到某些客户端时。

现在我使用的是TransientSubscriptions

我试着调试代码,但我能说的唯一一件事是每个订阅者都存储为某种类型的通用CallbackChannel

每个TransientSubscriber都是这样定义的。

代码语言:javascript
复制
T subscriber = OperationContext.Current.GetCallbackChannel<T>();

当它添加一个TransientSubscriber时,它会执行这个。

代码语言:javascript
复制
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);
    }
}

如果有更好的方法,那么我愿意接受建议。我只想发送一个通知给一个客户端,而不是所有客户端。

这里还有一篇关于ServiceModelEx的msdn文章。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-13 12:04:49

好的,这是我所做的。我添加了另一个泛型类,但这个类包含一个userID和一个泛型CallbackChannel。

代码语言:javascript
复制
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; }
    }
}

然后,我将包含T的ServiceModelEx中的每个参数都切换为包含Subscriber<T>。在那之后,我创建了一个名为FireUserEvent的新FireEvent,然后通过GetTransientList方法向下传递UserID,我还为这些方法创建了新的方法,以便在UserID中传递。这样,它只返回所述用户的Subscriber<T>

票数 0
EN

Stack Overflow用户

发布于 2017-06-26 14:27:23

您不需要(Juval明确建议您不要这样做)。发布/订阅的整个目的是将事件发送到所有订阅者。你永远不应该过滤谁得到了他们。它们是没有业务逻辑的实用程序。一旦您开始添加过滤,您就有可能陷入将易失性业务逻辑耦合到您的实用程序中的兔子洞。

如果有客户端应该获得某些事件,为什么他们要订阅这些事件?也许你在一个发布/订阅合同中捆绑了太多的事件类型。您可以通过将事件拆分到多个约定中来解决此问题,尽管当使用ServiceModelEx发布/订阅时,这将要求您使用多个发布/订阅服务。您可以通过按照以下示例使用Action="*“创建消息路由发布/订阅来解决此问题:http://blogs.microsoft.co.il/sasha/2008/03/15/wcf-router-and-publishsubscribe-sample-implementation/

或者,如果您希望将事件返回给特定的调用者,则应该使用不同的机制。例如,ServiceModelEx还提供了响应服务,在:http://idesign.net/downloads上搜索“响应服务”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13849616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档