7

OperationContext.Current.GetCallbackChannel 实际上做了什么?它如何识别每个客户?

我的 WCF 服务遇到问题。如果两个以上的用户连接到服务,我从服务发送给客户端的所有“有趣的更改”都将发送给第二个加入的用户。

例如,如果 A、B、C、D 加入服务,如果我通过回调将更改发送到 C 和 D,它将发送到 B。

有任何想法吗?

详情

客户端:ASP.NET Web 应用程序

绑定:netTCPBinding

更新1

好的,我找到了问题的原因。我在 IIS 中托管了 asp.net 客户端。例如客户端的 URL 是http://url1。如果我在不同的机器上打开页面的多个实例并加入服务,回调通道总是指向页面的第一个实例(我从不同的机器打开站点)。但是,如果我在 IIS 中的不同站点下托管 asp.net 客户端,则回调通道是唯一的。对此有什么想法吗?

4

2 回答 2

6

当服务接收到一个调用时,OperationContext.Current.GetCallbackChannel 将一个通道返回给那个调用者。它不会返回向所有客户端广播的频道。

根据您的问题,您可能只存储上次调用中检索到的回调。您实际上必须存储一个列表,其中包含已检索到的每个唯一回调实例。每次调用方法时,都会将回调实例添加到此列表中。当您想要广播时,您必须遍历列表中的每个项目并进行必要的调用。

如果您的服务使用 Singleton 实例模式,则实现对象可以将回调实例列表存储为数据成员。如果您的服务使用 Client 或 SingleCall 实例模式,那么您可以拥有一个包含回调实例列表的全局对象。

于 2010-07-05T04:12:57.363 回答
1

您必须配置您的服务为每个会话创建单独的线程。看看http://msdn.microsoft.com/en-us/library/cc681240.aspx

于 2010-07-03T12:01:14.477 回答