我要做的是拥有多个客户端注册的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);
任何人都知道为什么会这样,或者有任何关于如何继续尝试解决这个问题的线索?
答案 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中性能较低但是很常见。