【问题标题】:When to close WCF client?何时关闭 WCF 客户端?
【发布时间】:2009-04-27 03:24:19
【问题描述】:

我已将 WCF 服务的客户端代理实例放入 App 类的属性中,以便我可以从应用程序中的任何位置获取它。

我没有关闭客户端,而是在应用程序运行期间将其保持打开状态。造成这种情况的主要原因是,如果我按照 WCF 服务 mex 页面中的 // 评论(如果您将浏览器指向 WCF 服务 url,您会得到该页面),它会显示 // 始终关闭客户端。 客户端.Close();

这很好,除非我在调用 client.SomeAsync() 方法后立即调用 client.Close(),然后在结果返回之前将其关闭。我应该把 close 放入 Completed() 方法吗?或者我应该忘记关闭它,因为一旦它关闭,我必须创建一个新的客户端代理实例(如果是这种情况,最好不要将它存储在 App.property 中。

谢谢, 斯蒂芬

【问题讨论】:

    标签: c# wcf silverlight


    【解决方案1】:

    您应该按照建议关闭它。是的,如果您使用的是异步方法,那么您必须在调用完成后关闭它。

    创建(打开)和关闭客户端是 WCF 客户端的规范。持续创建和关闭新客户不会造成明显的性能损失。

    【讨论】:

    • 记得在 close 时添加 try catch,因为 close 会导致异常。 msdn.microsoft.com/en-us/library/ms405496.aspx。我像这样使用它 try { client.Close(); } 赶上 { 客户端.Abort(); }
    • 请注意,在 ClientBase 上调用 Dispose 也会导致调用 Close。
    【解决方案2】:

    最好在您的 Completed 方法的 finally{} 中明确关闭它。无论出于何种原因,如果客户端保持连接,您将开始阻止其他客户端调用。根据 HTTP RFC:

    定义于 1999 年 (RFC 2616) “客户端 使用持久连接的应该 限制并发数 他们维护的连接 给定的服务器。单用户客户端 不应保持超过 2 个 与任何服务器或代理的连接。 代理应该使用最多 2*N 连接到另一台服务器或 代理,其中 N 是 同时活跃用户。这些 指南旨在改进 HTTP 响应时间和避免 拥塞。”由于开发商是 使用 AJAX 或类似 AJAX 的请求 更新一个网页,http 限制是 讨论得越来越多。

    如果你没有关闭你的连接,那么你很可能会开始阻塞。我当然假设这是 HttpBinding。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多