WCF:代理打开和关闭-whaaa?
我正在使用WCF维护Windows窗体应用程序,并在内部使用Net.TCP。我们连接的生命周期是获取/使用/关闭 我们遇到应用程序池崩溃而没有跟踪的问题。在查看netstat时,我可以看到何时进入应用程序,因为我们有一个登录服务。然而,即使我们在using语句中创建代理,netstat中的连接也不会消失,直到我实际关闭应用程序 是这样吗?我应该在客户端上执行不同的操作来强制关闭连接吗WCF:代理打开和关闭-whaaa?,wcf,Wcf,我正在使用WCF维护Windows窗体应用程序,并在内部使用Net.TCP。我们连接的生命周期是获取/使用/关闭 我们遇到应用程序池崩溃而没有跟踪的问题。在查看netstat时,我可以看到何时进入应用程序,因为我们有一个登录服务。然而,即使我们在using语句中创建代理,netstat中的连接也不会消失,直到我实际关闭应用程序 是这样吗?我应该在客户端上执行不同的操作来强制关闭连接吗 因此,如果连接保持打开状态,它是否会在openTimeout设置期间保持打开状态,然后被断开?首先,您可能不应该
因此,如果连接保持打开状态,它是否会在
openTimeout
设置期间保持打开状态,然后被断开?首先,您可能不应该在using语句的上下文中使用代理,即使is实现了IDisposable:
也就是说,这完全取决于您如何使用代理。看看marc在这里的回答:是的,这是预期的行为:Net.TCP绑定与服务器之间有一个协议级传输会话,这在WCF中是无法真正控制的
我不知道WCF中有任何机制可以物理地中断该传输级会话-您可能可以使用低级TCP调用来完成此操作,但我从未有过这样的需要。Microsoft说,您始终必须在最后关闭连接(请参阅at MSDN)。我在这方面发现了以下模式: 文章说你应该避免使用
,因为它不能正确地关闭和处理WCF服务客户端对象,所以你应该用试试。。。抓住。。。最后
block,如上图所示-这样您就可以处理异常(异常将中止,然后重新抛出或处理异常),还可以处理最终关闭连接的问题。这一点在报告中也有明确说明
注意:finally
中的c.Close()
在出现异常(故障状态)时不会造成任何伤害,因为我们在重新引发异常之前调用c.Abort()
,因此c.Close()
在这种情况下实际上不起任何作用。但是,如果没有发生异常,则实际会正常执行c.Close()
,并按预期关闭连接
如果您的WCF服务的行为异常,则有许多(其他)原因可能会导致这种情况-您可以找到一些调试提示。Matt,感谢Steve的博客链接。那里还有更多与MSDN的链接,这些链接更能说明情况。当我们试图解决这个问题时,这些信息将对我们非常有帮助。另外一个问题。什么决定了有多少连接对服务开放?如果我们有多个客户端应用程序访问一个服务,并且其中一个客户端应用程序的数量比另一个客户端应用程序的数量少,而第一个客户端应用程序的数量少,那么这个数字是连接的最高点,还是客户端的最高点?谢谢。看看我的答案,它对我的情况有帮助,希望它也对你有帮助。
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();
}