我想要做的是拥有多个客户端注册到的 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);
有人知道为什么会发生这种情况,或者对我如何继续尝试解决这个问题有任何线索吗?