0

好的,所以我正在改变我的服务向客户推送通知的方式。现在 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文章。

4

2 回答 2

0

好的,这就是我所做的。我添加了另一个通用类,但这个类包含一个用户 ID 和通用 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 的每个参数切换为 hold Subscriber<T>。之后,我创建了一个新的FireEvent调用FireUserEvent,然后通过GetTransientList方法将 UserID 向下传递,我还创建了新的方法来传递 UserID。这样它只返回Subscriber<T>所述用户。

于 2012-12-13T04:04:48.717 回答
0

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

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

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

于 2017-06-26T06:27:22.543 回答