WCF 回调通道出现故障

Posted

技术标签:

【中文标题】WCF 回调通道出现故障【英文标题】:WCF Callback channel faulted 【发布时间】:2010-12-06 01:03:52 【问题描述】:

我正在尝试为 wcf 客户端实现重新连接逻辑。我知道您必须在当前频道进入故障状态后创建一个新频道。我在通道故障事件处理程序中执行此操作:


internal class ServiceClient : DuplexClientBase, IServiceClient

  public ServiceClient(ICallback callback, EndpointAddress serviceAddress)
   : base(callback, MyUtility.GetServiceBinding("NetTcpBinding"), serviceAddress)
  
   // Open the connection.
   Open();
  

  public void Register(string clientName)
  
    // register to service
  

  public void DoSomething()
  
    // some code
  
 

 public class ClientApp
 
  private IServiceClient mServiceClient;

  private ICallback mCallback;

  public ClientApp()
  
   mServiceClient = new ServiceClient( mCallback, new EndpointAddress("someAddress"));

   mServiceClient.Register();

   // register faulted event for the  service client
   ((ICommunicationObject)mServiceClient).Faulted += new EventHandler(ServiceClient_Faulted);
  

  void ServiceClient_Faulted(object sender, EventArgs e)
  
   // Create new Service Client.
   mServiceClient = new ServiceClient( mCallback, new EndpointAddress("someAddress"));

   // Register the EI at Cell Controller
   mServiceClient.Register();
  

  public void DoSomething()
  
   mServiceClient.DoSomething();
  
 

但是在我的单元测试中,我仍然得到一个“通信对象 System.ServiceModel.Channels.ServiceChannel,不能用于通信,因为它处于故障状态”异常。

回调通道是否仍有故障,如果是,我该如何更换回调通道?

【问题讨论】:

你能指定你的单元测试在触发异常时做什么吗? 在我的单元测试中,我创建了一个服务主机和一个客户端实例。我在服务上注册客户端,然后通过将引用设置为 null 来停止服务。之后我等待 20 秒(我正在使用 InactivityTimeoutof 10 秒的可靠会话,所以我确定连接在 20 秒后丢失),然后我在客户端上调用 DoSomething() 方法。现在我重新创建服务并期望客户端重新连接。在那一刻,我得到了例外。 【参考方案1】:

您是否尝试通过在 Faulted 事件处理程序中调用 mServiceClient.Abort 来重置通信通道?

编辑:

我发现您没有在恢复代码中重新初始化 mCallback 对象。您可能需要将其分配给新实例。

【讨论】:

感谢您的帮助。是的,我之前尝试过,但它并没有太大帮助,因为我得到一个“通信对象 System.ServiceModel.Channels.ServiceChannel,不能用于通信,因为它处于 Aborted 状态”异常而不是上面提到的例外。【参考方案2】:

到目前为止,我已经体验到需要在出现故障时重新创建 WCF 连接 - 否则似乎没有办法恢复它。至于何时发生故障,该方法似乎可以正常触发,但通常它会在当前请求进行时触发并清理 WCF 连接(建立新连接等) - 导致此失败 - 特别是在超时时。

几个建议: - 如果它与超时有关,请跟踪上次调用的时间和包含超时值的常量。如果 WCF 连接由于不活动而被丢弃,请在通过网络发送请求之前丢弃它并重新创建它。 - 另一件事,看起来你没有重新添加故障处理程序,这意味着第一个故障将得到处理,但第二次故障时它会在没有处理程序的情况下翻倒,因为没有附加新的处理程序。

希望对你有帮助

【讨论】:

以上是关于WCF 回调通道出现故障的主要内容,如果未能解决你的问题,请参考以下文章

如果出现故障,如何自动重新建立双工通道?

Wcf 回调网络 tcp 双工仅 1 路故障

WCF 通道故障状态是不是有帮助?

通过 WCF 双工通道长期运行的回调合同 - 替代设计模式?

为啥缓存 WCF 通道是一件坏事?

WCF:是不是可以在双工通道中使用流模式?