"OperationContext.Current.GetCallbackChannel" 实际上是做什么的?

7

OperationContext.Current.GetCallbackChannel是做什么的?它如何识别每个客户端?

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

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

有什么想法吗?

详细信息

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

绑定:netTCPBinding

更新1

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


3
我已经告诉过你,你正在做的事情不会起作用。这条评论不是给你的 - 而是给以后阅读它的其他人的。在请求完成后,永远不要尝试调用或引用ASP.NET页面。页面将不存在。 - John Saunders
1
谢谢你的评论,约翰。我正在深入了解回调函数的工作原理。你之前说的一切都非常清晰明了。我不会再朝着同样的方向努力了。 - NLV
2个回答

6
当服务接收到调用时,OperationContext.Current.GetCallbackChannel返回的是与该调用者通信的通道。它不会返回广播给所有客户端的通道。
从您的问题中可以看出,您可能只存储了上一次检索到的回调。实际上,您需要存储一个列表,其中包含已检索到的每个唯一回调实例。每次调用方法时,都将回调实例添加到此列表中。当您想要广播时,必须遍历列表中的每个项目并进行必要的调用。
如果您的服务使用Singleton实例模式,则实现对象可以将回调实例列表存储为数据成员。如果您的服务使用Client或SingleCall实例模式,则可以有一个全局对象,其中包含回调实例列表。

是的。这就是我正在做的。我正在为我的服务使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]。但我仍然遇到同样的问题。现在我已经创建了一个字典来存储回调通道。仍然所有加入第二个用户之后的用户的回调通道都指向第二个用户。我正在遵循这篇伟大的文章 - http://www.codeproject.com/KB/WCF/WCFWPFChat.aspx,作者是Sacha Barber。 - NLV
“OperationContext.Current.GetCallbackChannel” 是基于我从客户端调用服务时使用的代理对象吗? - NLV
更新了我的帖子,请查看。 - NLV

1

是的,我知道。我已经配置了会话模式、实例上下文和其他创建带有回调的双工合同所需的配置。我的问题是它如何实际与客户端创建通道? - NLV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接