【问题标题】:How do I properly handle a faulted WCF connection?如何正确处理出现故障的 WCF 连接?
【发布时间】:2010-03-20 23:15:50
【问题描述】:

在我的客户端程序中,有一个 WCF 连接在启动时打开,并且应该保持连接直到关闭。但是,服务器有可能由于不可预见的情况而关闭(想象有人拉电缆)。

由于客户端在很多地方使用了很多契约方法,我不想在每个方法调用上都添加 try/catch。

我有两个处理这个问题的想法:

  1. 创建一个方法,该方法接受委托并在 try/catch 中执行委托,并在已知异常的情况下返回异常,否则返回 null。调用者必须处理 nun-null 结果。

  2. 监听底层通信对象的故障事件。但是除了显示一些错误消息并关闭之外,我不知道如何处理该事件。

对于有故障的 WCF 连接是否有一些最佳实践在应用程序生命周期内存在

【问题讨论】:

    标签: wcf


    【解决方案1】:

    如果您确实可以控制线路的两端 - 服务器和客户端都是 .NET 应用程序 - 您可以考虑这种方法:

    • 将所有服务和数据合同放入一个共享程序集中,服务器和客户端都将使用该程序集

    • 在启动时创建ChannelFactory<IYourService>并缓存它;因为它需要访问服务合同,所以只有当您可以在服务器和客户端之间共享实际的服务合同时,这才有效。此操作是构建 WCF 客户端的昂贵部分

      ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();
      
    • 在每次调用时根据 ChannelFactory 创建客户端和服务器之间的实际通信通道。这非常便宜,而且不会花费太多时间——而且您完全可以跳过任何关于必须检测或处理故障通道的想法.....

      IYourService client = factory.CreateChannel();
      client.CallYourServiceMethod();
      

    否则,您基本上需要做的是将所有服务调用包装到一个方法中,该方法将首先检查通道的故障状态,如果客户端代理出现故障,则中止当前的并重新创建一个新的。

    【讨论】:

    • 我已经在做你建议的前 2 个要点,我应该将该信息添加到问题中。但是,我不喜欢您的第三点:创建频道也需要一定量的 try/catch,所以我没有任何收获。
    • 至于最后一段,我想我喜欢这个主意。我没想过尝试重新创建频道,好主意。
    【解决方案2】:

    我写了一篇关于 WCF 中的异常的博客文章,讨论了如何处理这个问题:http://jamescbender.com/bendersblog/Default.aspx

    【讨论】:

    • 实际上,截至今天,您关于故障频道的博文已不再在线。
    • 这就是 Stack Overflow 中的链接很糟糕的原因。您的博客将在 10 年内不存在,但它会存在!
    • 链接不再可用。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2015-03-04
    • 2012-08-11
    • 2010-12-06
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多