在我的客户端程序中,有一个WCF连接在启动时打开,并且据称保持连接直到关闭。但是,由于不可预见的情况,服务器有可能关闭(想象有人拉电缆)。
由于客户端在很多地方使用了很多契约方法,我不想在每个方法调用上添加try / catch。
我有两个处理这个问题的想法:
创建一个方法,该方法接受委托并在try / catch中执行委托,并在已知异常的情况下返回异常,或者返回null。调用者必须处理nun-null结果。
收听底层CommunicationObject的Faulted事件。但我不知道除了显示一些错误信息和关闭外,我怎么能处理这个事件。
是否存在针对应用有效期存在的故障WCF连接的最佳做法?
答案 0 :(得分:1)
如果您的控制线的两端都在您的控制范围内 - 服务器和客户端都是.NET应用程序 - 您可以考虑采用这种方法:
将所有服务和数据合同放入共享程序集中,服务器和客户端都将使用
在启动时创建ChannelFactory<IYourService>
并缓存它;因为它需要访问服务合同,所以只有在您可以共享服务器和客户端之间的实际服务合同时才有效。此操作是构建WCF客户端的昂贵部分
ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();
每次拨打电话时,都会根据ChannelFactory创建客户端和服务器之间的实际通信通道。这非常便宜并且不会花费太多时间 - 而且您可以完全忽略关于必须检测或处理故障通道的任何想法......
IYourService client = factory.CreateChannel();
client.CallYourServiceMethod();
否则,您基本上需要做的是将所有服务调用包装到一个方法中,该方法将首先检查通道的故障状态,如果客户端代理出现故障,则中止当前的一个并重新创建一个新的。
答案 1 :(得分:0)
我写了一篇关于WCF异常的博客文章,讨论如何处理这个问题:http://jamescbender.com/bendersblog/Default.aspx