2009-09-09 164 views
24

我们正在使用WCF服务关闭WCF连接

在客户端,我们正计划明确地关闭连接 似乎有关闭

样本1的多,其中一个方法: 在finally块WCF服务消费使用

if (client.State == CommunicationState.Faulted) 
{ 
    client.Abort(); 
} 
client.Close(); 

,因为如果服务处于故障状态,我们将无法调用close()

样品2:

using(ClientProxy proxy = new ClientProxy()) 
{ 
    //call your service methods 
} 

在SAMPLE2我不知道,如果服务处于故障状态会发生什么,它会抛出错误关闭连接?

+0

@ Balaji-看看这后http://stackoverflow.com/questions/573872/what-is-the-best-workaround- for-the-wcf-client-using-block-issue。这是最有帮助的 – RichardOD 2009-09-18 10:11:48

回答

16

使用“使用”块的第二个示例不正确。 using块确保在代理对象上调用Dispose方法。 Dispose方法依次调用Close方法,它将尝试连接到通信状态出错时将引发异常的服务。所以你的感受/预感是绝对正确的。如果代理Dispose方法从第一个样品使用的代码,但它并没有那么不使用using块:)

34

你手头所有必要的信息 - 生成的最佳实践使用和妥善关闭/中止所有的WCF客户端代理是:

YourClientProxy clientProxy = new YourClientProxy(); 

try 
{ 
    .. use your service 
    clientProxy.Close(); 
} 
catch(FaultException) 
{ 
    clientProxy.Abort(); 
} 
catch(CommunicationException) 
{ 
    clientProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    clientProxy.Abort(); 
} 

捕获FaultException处理服务响应时出现错误情况(因此您的通道处于故障状态)的所有情况,并且CommunicationException将处理所有可能发生的与通信有关的所有其他异常,例如网络连接中断等。

使用using()块的方法将不起作用,因为如果块的末尾发生异常,而Dispose()方法在客户端代理上调用Close()方法时,则无法捕捉和处理。

+0

感谢所有的答复。 我希望在web.config文件中有一些设置来处理连接关闭! – Balaji 2009-09-09 15:35:48

+1

FaultException是CommunicationException,所以在技术上你不需要两个catch子句(除非你打算以不同的方式处理两个case)。 – bobbymcr 2009-09-09 20:29:36

+0

FaultException是CommunicationException的后裔,你是对的 - 只要处理CommunicationException就可以了,只要你不需要为两种不同的情况做不同的事情。猜猜这只是我的一个习惯,即使我没有对它们中的任何一个做任何特殊的事情,也可以单独列出最常见的异常类型..... – 2009-09-09 20:34:11

4

在朱瓦尔·洛的优秀Programming WCF book他建议:

try 
{ 
    ClientProxy clientProxy = new ClientProxy(); 
    clientProxy.SomeMethod(); 
    clientProxy.Close(); 
} 
catch 
{ 
    proxy.Abort(); 
} 
+2

哈..我在书中看到了这段代码,但我认为它不能编译。该服务必须在try块之外进行声明,以便在catch块中进行访问......然后您可能希望对其进行空检查。 – foson 2011-04-01 20:25:12

+0

@ foson-你知道它在哪个页面吗?你对上述代码是正确的。我有这本书,但现在读了一段时间。 – RichardOD 2012-01-31 20:04:09