“OperationContext.Current.GetCallbackChannel”实际上做了什么?

时间:2010-07-03 11:53:57

标签: c# wcf callback duplex

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

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

对于ex,如果A,B,C,D加入服务,如果我通过回调将更改发送到C和D,它将转到B.

有什么想法吗?

详情

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

绑定:netTCPBinding

UPDATE1

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

2 个答案:

答案 0 :(得分:6)

当服务收到呼叫时,OperationContext.Current.GetCallbackChannel会将通道返回给该呼叫者。它不会返回广播给所有客户端的频道。

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

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

答案 1 :(得分:1)

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