好了,我改变了我的服务向客户端推送通知的方式。目前,ServiceModelEx的工作方式是,如果任何客户端订阅了某个事件,它都会向所有订阅的用户发送消息,而不管该消息是否针对他们。在客户端,我确定消息是否是给他们的。正如您可以想象的那样,这会产生大量的网络流量,特别是当您只需要发送到某些客户端时。
现在我使用的是TransientSubscriptions。
我试着调试代码,但我能说的唯一一件事是每个订阅者都存储为某种类型的通用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);
}
}如果有更好的方法,那么我愿意接受建议。我只想发送一个通知给一个客户端,而不是所有客户端。
这里还有一篇关于ServiceModelEx的msdn文章。
发布于 2012-12-13 12:04:49
好的,这是我所做的。我添加了另一个泛型类,但这个类包含一个userID和一个泛型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; }
}
}然后,我将包含T的ServiceModelEx中的每个参数都切换为包含Subscriber<T>。在那之后,我创建了一个名为FireUserEvent的新FireEvent,然后通过GetTransientList方法向下传递UserID,我还为这些方法创建了新的方法,以便在UserID中传递。这样,它只返回所述用户的Subscriber<T>。
发布于 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上搜索“响应服务”。
https://stackoverflow.com/questions/13849616
复制相似问题