2010-03-20 25 views
1

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

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

我有2个想法来处理这个问题:

  1. 创建需要一个委托并执行一个try/catch里面的代表,并在已知的异常的情况下,返回一个异常的方法,或null否则。调用者必须处理nun-null结果。

  2. 收听基础CommunicationObject的Faulted事件。但我不明白我能如何处理这个事件,除了显示一些错误信息并关闭之外。

是否有存在的应用程序生命周期断块WCF连接一些最佳做法?

回答

0

我写了一篇关于在WCF异常一篇博客文章,与如何处理这个交易:http://jamescbender.com/bendersblog/Default.aspx

+2

实际上,您的关于Faulted频道的博文已不再在线,截至今日。 – SwissCoder 2012-10-18 08:49:48

+0

这就是Stack Overflow中的链接会被吸引的原因。你的博客将在10年内不存在,但这将会! – 2014-03-05 16:36:30

+0

链接不再可用。 – dpurrington 2014-10-22 18:55:55

1

如果你有电线的两端你的控制之下 - 服务器和客户端的.NET应用程序 - 你能想到这种方法代替:

  • 把所有的服务和数据合同到服务器和客户端将使用

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

    ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>(); 
    
  • 的昂贵的部分创建客户端和服务器之间的每次拨打电话的基础上,的ChannelFactory时间的实际通信信道。这是相当便宜,不花费太多的时间 - 并且可以完全跳过关于有检测或处理断陷渠道的任何想法.....

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

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

+0

我已经在做你的建议前2个要点,我应该补充说,信息的问题。但是,我不喜欢你的第三点:创建一个频道也需要一定量的try/catch,所以我没有得到任何东西。 – mafu 2010-03-20 12:05:56

+0

至于最后一段,我想我喜欢那个想法。我没有想到试图重新创建频道,好主意。 – mafu 2010-03-20 12:07:06