1

我想要做的是拥有多个客户端注册到的 wcf 双工服务。当客户端调用服务时,其他客户端会收到调用通知。

现在,我有一个调用 wcf 双工服务的 Silverlight 应用程序。第一次通话时一切正常,包括双工通信。在第二次调用该服务时,我得到一个:

The communication object, System.ServiceModel.Channels.ClientPollingDuplexSessionChannel, cannot be used for communication because it is in the Faulted state.

我的服务有两种不同的方法;RegisterClient 和 ReassignOwner。如果我以任何顺序调用相同的方法两次或两种方法一次,我仍然会收到此错误。

在研究了这个主题之后,我认为这可能是一个超时问题。我检查了默认超时值是多少,它是 10 分钟。我在 2-3 分钟的时间内完成了这两个电话。为了确定,我还将不活动超时和接收超时增加到 4 小时,但我仍然遇到这个问题。

接下来,我认为我的服务可能会生成一个异常,这会导致客户端进入故障状态。为了测试这一点,我在我的服务的 2 种方法中放置了 try/catch 语句,并在调试模式下运行程序。我没有发现任何异常。我还尝试从这 2 个方法中注释掉所有代码(因此不会产生异常),并且只调用这 2 个空方法,我仍然得到异常。

通过阅读关于 SO 的其他相关文章,我决定尝试 WCF 跟踪。我在 web.config 中启用了它并将开关值设置为警告。我收到 2 个警告:

Description Faulted System.ServiceModel.Channels.ServicePollingDuplexSessionChannel
Description Faulted System.ServiceModel.Channels.ServiceChannel

以下是我的服务在 .svc.cs 文件后面的代码中的定义方式:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, AutomaticSessionShutdown = false)] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class NotificationService : BaseService, INotificationDuplexService

在我的服务合同中,我的方法都具有以下属性:

[OperationContract(AsyncPattern = true, IsOneWay = true,
                   Action = "http://www.abc.org/NotificationDuplex/INotificationDuplexService/MethodName")]

我的两种方法都是用 Begin 和 End 方法以异步方式实现的。

这是我调用方法的方式

base.InvokeAsync(this.onBeginRegisterClientDelegate, new object[] {
                    id}, this.onEndRegisterClientDelegate, this.onRegisterClientCompletedDelegate, userState);

有人知道为什么会发生这种情况,或者对我如何继续尝试解决这个问题有任何线索吗?

4

3 回答 3

2

您的 ServiceContract 是否需要 CallbackContract?如果是这样,我建议您在此处阅读有关回调重入的内容 - 它很好地描述了 WCF 如何在您使用回调时主动故障您的通信通道以防止死锁,以及您应该采取哪些措施来防止死锁。

于 2011-03-02T14:09:00.220 回答
1

我看到的另一个解决方案是我自己实现的,它是设置“心跳”。我将我的配置设置为 MultipleMessagesPerPoll,并且服务继续运行没有问题,因为我让客户端至少每 9 秒 ping 一次服务器。这似乎是一个神奇的数字——九秒后通道超时并进入故障状态。只需设置一个线程来 ping 服务(使用称为 ping 的方法或其他方法),服务就可以用“pong”响应客户端。

同意这个问题在 Chrome 或其他浏览器上似乎不是问题。

于 2011-12-08T14:09:38.493 回答
0

最后我在一个类似的问题中找到了遮阳篷:Silverlight PollingDuplex InnerChannel faulted with multipleMessagesPerPoll (serverPollTimeout)

当您将 PollingDuplexHttpBinding 设置为 PollingDuplexMode.MultipleMessagesPerPoll 并在 IE 8 下运行应用程序时,似乎存在错误(其他浏览器不受影响)。

解决方案是将 PollingDuplexMode 设置为 SingleMessagePerPoll,这在 IE8 中性能较低但具有功能性。

于 2011-03-04T13:11:18.140 回答