“OperationContext.Current.GetCallbackChannel”实际上是做啥的?

Posted

技术标签:

【中文标题】“OperationContext.Current.GetCallbackChannel”实际上是做啥的?【英文标题】:What does "OperationContext.Current.GetCallbackChannel" actually do?“OperationContext.Current.GetCallbackChannel”实际上是做什么的? 【发布时间】:2011-03-11 10:16:13 【问题描述】:

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

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

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

有什么想法吗?

详情

客户端:ASP.NET 网络应用程序

绑定:netTCPBinding

更新1

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

【问题讨论】:

我已经告诉过你,你正在做的事情是行不通的。此评论不适合您 - 适合稍后阅读的其他人。在请求完成后,不要永远尝试回调或引用 ASP.NET 页面。该页面将不存在。 感谢您的评论约翰。我只是在深入研究回调的工作原理。你所说的一切都说得通。我不再朝同一个方向尝试了。 【参考方案1】:

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

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

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

【讨论】:

是的。这就是我正在做的事情。我正在为我的服务使用 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]。但我仍然遇到同样的问题。现在我创建了一个字典来存储回调通道。在第二个用户(来自第三个用户)之后加入的用户的所有回调通道仍然始终指向第二个用户。我正在关注这篇很棒的文章 - Sacha Barber 的 codeproject.com/KB/WCF/WCFWPFChat.aspx。 “OperationContext.Current.GetCallbackChannel”是基于我用来从客户端调用服务的代理对象吗? 更新了我的帖子。请检查一下。【参考方案2】:

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

【讨论】:

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

以上是关于“OperationContext.Current.GetCallbackChannel”实际上是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在双工回调中读取 WCF 消息头?

WCF Cookie处理

读取请求消息正文时出错

DotNetOpenAuth 和 ResourceServer 服务 https 配置

C# WCF 服务,阅读soapenv 标头安全部分

识别 WCF 服务中的客户端