我正在使用 WCF 维护一个 Windows 窗体应用程序,并在内部使用 Net.TCP。我们连接的生命周期是 GET/USE/CLOSE。
我们遇到了应用程序池崩溃而没有任何痕迹的问题。在查看 netstat 时,我可以看到我何时进入应用程序,因为我们有一个登录服务。然而,即使我们在 using 语句中创建代理,netstat 中的连接也不会消失,直到我物理关闭应用程序。
这是正确的吗?我应该在客户端上做一些不同的事情来强制关闭连接吗?
因此,如果连接保持打开状态,它是否会在 openTimeout
期间保持打开状态?设置然后被拆除?
最佳答案
微软说你总是必须在最后关闭连接(参见 MSDN 上的 example)。我在此 article about WCF disposal handling 中发现了以下模式:
WCFServiceClient c = new WCFServiceClient();
try
{
c.HelloWorld();
}
catch
{
// acknowledge the Faulted state and transition to Closed
c.Abort();
// handle or throw
throw;
}
finally
{
c.Close();
}
文章说你应该避免
using
由于它没有正确关闭和处理 WCF 服务客户端对象,您应该使用 try ... catch ... finally
来完成它。块而不是如上所示 - 这样您就可以处理异常(它将中止然后重新抛出或处理异常),并且您还负责最终关闭连接。这在Microsoft's WCF troubleshooting hints.中也有明确说明注:
c.Close()
在 finally
在异常(故障状态)的情况下不会造成任何伤害,因为我们调用 c.Abort()
在重新抛出异常之前 c.Close()
在这种情况下实际上什么都不做。但是,如果没有异常发生,则c.Close()
实际上正常执行并且连接按预期关闭。如果您的 WCF服务行为方式很奇怪,有很多(其他)事情可能会导致这种情况 - here你可以找到一些调试提示。
关于WCF:代理打开和关闭 - whaaa?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2838026/