为什么我的Wcf Duplex服务在首次调用服务后会出现故障状态?

时间:2011-03-02 13:10:32

标签: silverlight wcf pollingduplexhttpbinding

我要做的是拥有多个客户端注册的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分钟的时间内完成两个电话。我还将Inactivity超时和接收超时增加到4小时,以确保我仍然遇到此问题。

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

通过阅读SO上的其他相关帖子,我决定尝试WCF跟踪。我在web.config中启用了它,并将开关值设置为Warning。我得到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")]

我的方法都是以Async方式实现的,带有Begin和End方法。

以下是我调用方法的方法

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

任何人都知道为什么会这样,或者有任何关于如何继续尝试解决这个问题的线索?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

最后,我在一个类似的问题中发现了这个问题:Silverlight PollingDuplex InnerChannel faulted with multipleMessagesPerPoll (serverPollTimeout)

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

解决方案是将PollingDuplexMode放到SingleMessagePerPoll中,这在IE8中性能较低但是很常见。