【问题标题】:WCF: Proxy open and close - whaaa?WCF:代理打开和关闭 - whaaa?
【发布时间】:2012-10-18 18:44:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • 看看我的回答,对我有帮助,希望对你也有帮助。

标签: wcf


【解决方案1】:

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.中也有明确说明

注意: finally 中的 c.Close() 在异常(故障状态)的情况下不会造成任何伤害,因为我们在重新抛出异常之前调用 c.Abort() 所以在这种情况下,c.Close() 实际上什么都不做。但是,如果没有出现异常,那么c.Close()实际上是正常执行的,连接按预期关闭。

如果您的 WCF 服务 行为异常,有很多(其他)因素可能导致这种情况 - here 您可以找到一些调试提示。

【讨论】:

    【解决方案2】:

    首先,您可能不应该在 using 语句的上下文中使用您的代理,即使它确实实现了 IDisposable:http://stevesmithblog.com/blog/idisposable-and-wcf/

    话虽如此,这完全取决于您如何使用代理。看看 marc 的回复:C#, WCF, When to reuse a client side proxy

    【讨论】:

    • 马特,感谢史蒂夫博客的链接。那里有更多指向 MSDN 的链接,可以更清楚地了解情况。当我们试图解决这个问题时,这些信息将对我们非常有帮助。一个附加问题。什么决定了服务打开了多少连接?如果我们有多个客户端应用程序访问一项服务,并且其中一个服务的编号小于另一个,并且编号较低的应用程序首先命中,那么该数字是连接的高水位线,还是客户端?谢谢。
    【解决方案3】:

    是的,这是预期的行为:Net.TCP 绑定与您的服务器有一个协议级别的传输会话,这是您在 WCF 中无法真正控制的。

    我不知道 WCF 中有任何机制可以物理地拆除该传输级会话 - 您也许可以使用低级 TCP 调用来做到这一点,但我从来不需要做这样的事情.

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 2014-12-29
      • 2011-09-08
      • 2022-11-14
      • 2015-04-24
      相关资源
      最近更新 更多