WCF:代理打开和关闭 - whaaa?

时间:2010-05-14 22:25:46

标签: wcf

我正在维护使用WCF的Windows窗体应用程序,并在内部使用Net.TCP。我们的连接的生命周期是GET / USE / CLOSE。

我们遇到的问题是应用程序池崩溃而没有任何痕迹。在查看netstat时,我可以看到当我进入应用程序时,因为我们有登录服务。但是,即使我们在using语句中创建代理,netstat中的连接也不会消失,直到我关闭应用程序。

这是对的吗?我应该在客户端做一些不同的事情来强制连接关闭吗?

因此,如果连接保持打开状态,它是否在openTimeout设置期间保持打开状态,然后被拆除?

3 个答案:

答案 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调用来做到这一点,但是我从来没有必要做那样的事情。

相关问题