我使用 WCF 维护一个 Windows 窗体应用程序,并在内部使用 Net.TCP。我们连接的生命周期是获取/使用/关闭。
我们遇到了应用程序池崩溃且没有任何痕迹的问题。在查看 netstat 时,我可以看到何时进入应用程序,因为我们有登录服务。但是,即使我们在 using 语句中创建代理,netstat 中的连接也不会消失,直到我物理关闭应用程序。
这是正确的吗?我应该在客户端上做一些不同的事情来强制关闭连接吗?
因此,如果连接保持打开状态,它是否在连接持续时间内保持打开状态?openTimeout
设置然后被拆除?
微软说你总是必须在最后关闭连接(参见example http://msdn.microsoft.com/en-us/library/ms751475%28v=vs.90%29.aspx在 MSDN)。我发现了以下模式关于 WCF 处置处理的文章 http://www.codeproject.com/Articles/74129/The-Proper-Use-and-Disposal-of-WCF-Channels-or-Com:
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();
}
文章说你应该avoid using
由于它没有正确关闭和处置 WCF 服务客户端对象,因此您应该使用try ... catch ... finally
相反,如上所示 - 这样您就可以处理异常(它将中止,然后重新抛出或处理异常),并且您还负责最终关闭连接。这在《中》中也有明确规定Microsoft 的 WCF 故障排除提示。 http://msdn.microsoft.com/en-us/library/aa355056%28v=vs.90%29.aspx
Note: The c.Close()
in the finally
在发生异常(故障状态)时不会造成任何损害,因为我们调用c.Abort()
在重新抛出异常之前,所以c.Close()
在这种情况下实际上什么也没做。但是,如果没有发生异常,那么c.Close()
实际上正常执行并且连接按预期关闭。
If your WCF服务行为方式很奇怪,有很多(其他)事情可能导致这种情况 -here https://stackoverflow.com/a/12800645/1016343你可以找到一些调试提示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)