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

时间:2012-11-14 11:04:22

标签: windows wcf service state faulted

  

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

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

这是堆栈跟踪:

  

堆栈跟踪:at   System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen()   在System.ServiceModel.Channels.ServiceChannel.Call(String action,   Boolean oneway,ProxyOperationRuntime操作,Object [] ins,   对象[]出局,TimeSpan超时)at   System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage   methodCall,ProxyOperationRuntime operation)at   System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天   消息)

     

在[0]处重新抛出异常:at   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即时聊天   reqMsg,IMessage retMsg)at   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&安培;   msgData,Int32类型)at   GridSplitter.CommandServiceReference.ICommandService.SendToMultipleChannel(字符串[]   channel,Int32 [] [] locid,String cmd,Int32 cmdData)at   GridSplitter.CommandServiceReference.CommandServiceClient.SendToMultipleChannel(字符串[]   channel,Int32 [] [] locid,String cmd,Int32 cmdData)at   GridSplitter.MainWindow.bwChkAndSendRedeploy_DoWork(对象发送者,   DoWorkEventArgs e):11/9/2012 11:05:58 AM

  1. 我无法理解为什么服务会进入故障状态。
  2. 我是否应该捕获此异常并执行一些补丁工作(如果推荐)?
  3. TCP绑定可以帮助我避免/删除此异常吗?

1 个答案:

答案 0 :(得分:4)

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

您需要在lines shown in this good post上为WCF特定要求编写适当的异常处理逻辑。无论您配置代理使用的实际绑定如何,都需要这样做。