通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信,因为它处于故障状态

Posted

技术标签:

【中文标题】通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信,因为它处于故障状态【英文标题】:The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state 【发布时间】:2012-11-02 21:01:11 【问题描述】:

通信对象,System.ServiceModel.Channels.ServiceChannel, 无法用于通信,因为它处于故障状态。

当 Windows 应用程序尝试通过 wsDualHttpBinding 与托管为 Windows 服务的 WCF 通信时,我收到此错误。 WCF 用于通过串行端口与设备通信。用于通过 WCF windows 服务频繁发送命令的 Windows 应用程序。

这是堆栈跟踪:

堆栈跟踪:在 System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen() 在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, Object[] 出局,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime 操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 留言)

在 [0] 处重新抛出异常:在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData,Int32 类型)在 GridSplitter.CommandServiceReference.ICommandService.SendToMultipleChannel(String[] 通道,Int32[][] locid,字符串 cmd,Int32 cmdData)在 GridSplitter.CommandServiceReference.CommandServiceClient.SendToMultipleChannel(String[] 通道,Int32[][] locid,字符串 cmd,Int32 cmdData)在 GridSplitter.MainWindow.bwChkAndSendRedeploy_DoWork(对象发送者, DoWorkEventArgs e) : 11/9/2012 11:05:58 AM

    我不明白为什么服务会进入故障状态。 是否应该捕获此异常并执行一些修补工作(如果推荐)? TCP 绑定能否帮助我避免/删除此异常?

【问题讨论】:

【参考方案1】:

您的问题是在服务调用产生故障后,您的代码正在使用服务代理的实例(服务参考,由 SvcUtil 生成或直接从 ChannelFactory 创建)。 WCF 的实现方式,一旦与该代理的调用引发了错误,您就不能“重用”服务代理。

您需要沿着lines shown in this good post 编写适当的异常处理逻辑,以满足 WCF 的特定要求。无论您配置要使用的代理的实际绑定如何,都需要执行此操作。

【讨论】:

你好 Sixto,我按照你提供的链接的建议实现了,到目前为止它正在工作,谢谢,非常感谢。马诺伊 好消息,WCF 有一些隐藏的错综复杂的东西,经常会出现。很高兴代码有所帮助,希望您接受我的回答。谢谢!

以上是关于通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信,因为它处于故障状态的主要内容,如果未能解决你的问题,请参考以下文章

System.ServiceModel.CommunicationObjectFaultedException

如何将 System.ServiceModel.ClientBase<TChannel> 设置为忽略 CERT 错误

c# winform 无法访问已释放的对象。 对象名:“System.ServiceModel.Channels.ServiceChannel”。

System.ServiceModel 参考

缺少 System.ServiceModel

System.ServiceModel.CommunicationException:底层连接已关闭