好的,我正在改变我的服务向客户推送通知的方式。现在,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);
}
}
如果有更好的方法,那么我愿意接受建议。我只想向1个客户端而不是所有客户端发送通知。
此处还有一篇关于ServiceModelEx的msdn文章。
答案 0 :(得分:0)
好的,这就是我的所作所为。我添加了另一个泛型类,但是这个类包含一个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中的每个参数切换为持有Subscriber<T>
。之后,我创建了一个名为FireEvent
的新FireUserEvent
,然后通过GetTransientList
方法向下传递UserID,我还创建了新方法以传递UserID。这样它只返回所述用户的Subscriber<T>
。
答案 1 :(得分:0)
你没有(Juval明确建议你不要这样做)。 pub / sub的全部目的是将事件发送给所有订阅者。你永远不应该过滤谁获得它们。它们是没有业务逻辑的实用程序。一旦你开始添加过滤,你就有可能将一个将易失性业务逻辑耦合到你的实用程序中的兔子洞。
如果有客户应该获得某些事件,他们为什么订阅它们?也许你将太多的事件类型捆绑到一个pub / sub合同中。您可以通过将事件拆分为多个合同来解决此问题,但是当使用ServiceModelEx pub / sub时,这将要求您使用多个发布/订阅服务。您可以通过使用Action =“*”创建消息路由pub / sub来解决此问题:http://blogs.microsoft.co.il/sasha/2008/03/15/wcf-router-and-publishsubscribe-sample-implementation/
或者,如果要将事件提供给特定调用者,则应使用其他机制。例如。 ServiceModelEx还提供称为响应服务的东西,在http://idesign.net/downloads搜索“响应服务”。