我正在维护使用WCF的Windows窗体应用程序,并在内部使用Net.TCP。我们的连接的生命周期是GET / USE / CLOSE。
我们遇到的问题是应用程序池崩溃而没有任何痕迹。在查看netstat时,我可以看到当我进入应用程序时,因为我们有登录服务。但是,即使我们在using语句中创建代理,netstat中的连接也不会消失,直到我关闭应用程序。
这是对的吗?我应该在客户端做一些不同的事情来强制连接关闭吗?
因此,如果连接保持打开状态,它是否在openTimeout
设置期间保持打开状态,然后被拆除?
答案 0 :(得分:4)
Microsoft表示您必须最后关闭连接(请参阅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()
在这种情况下实际上什么也没做。但是,如果没有发生异常,则{{1}}实际上正常执行,连接按预期关闭。
如果您的 WCF服务以奇怪的方式运行,可能会导致许多(其他)事情发生 - here您可以找到一些调试提示。
答案 1 :(得分:0)
首先,你可能不应该在using语句的上下文中使用你的代理,即使它确实实现了IDisposable:http://stevesmithblog.com/blog/idisposable-and-wcf/
话虽如此,这完全取决于您如何使用代理。请看一下marc的回复:C#, WCF, When to reuse a client side proxy
答案 2 :(得分:0)
是的,这是预期的行为:Net.TCP绑定与您的服务器有一个协议级传输会话,这是您在WCF中无法真正控制的。
我不知道WCF中有什么机制可以物理地拆除那个传输级会话 - 你可能能够使用低级TCP调用来做到这一点,但是我从来没有必要做那样的事情。