有效关闭WCF 4通道的正确方法

我使用以下方法关闭WCF 4通道。 这是正确的方法吗?

using (IService channel = CustomChannelFactory.CreateConfigurationChannel()) { channel.Open(); //do stuff }// channels disposes off?? 

虽然没有严格针对频道,但您可以这样做:

 ChannelFactory channelFactory = null; try { channelFactory = new ChannelFactory(); channelFactory.Open(); // Do work... channelFactory.Close(); } catch (CommunicationException) { if (channelFactory != null) { channelFactory.Abort(); } } catch (TimeoutException) { if (channelFactory != null) { channelFactory.Abort(); } } catch (Exception) { if (channelFactory != null) { channelFactory.Abort(); } throw; } 

曾经是在WCF“早期”发布WCF客户端代理的普遍接受的方式。

然而事情发生了变化。 事实certificate, IClientChannel .Dispose()的实现只是调用IClientChannel .Close()方法,这可能会在某些情况下抛出exception ,例如底层通道未打开或可以’及时关闭。

因此,在catch块中调用Close()并不是一个好主意,因为如果发生exception,可能会留下一些未发布的资源。

建议的方法是在catch块中调用IClientChannel .Abort() ,以防Close()失败。 这是一个例子:

 try { channel.DoSomething(); channel.Close(); } catch { channel.Abort(); throw; } 

更新:

以下是对描述此建议的MSDN文章的引用。