【问题标题】:How can I get WCF to close connections automatically?如何让 WCF 自动关闭连接?
【发布时间】:2009-06-05 00:56:40
【问题描述】:

当我使用内置的 Visual Studio 模板创建 WCF 应用程序并尝试在循环中调用它时,只有 5 个请求通过。然后服务停止响应。我可以解决这个问题的唯一方法是在每次通话后关闭连接。

我知道您应该自己清理,但我也知道您不必对 Web 服务执行此操作。许多将要访问我们服务的人不会关闭他们的连接。

有没有办法通过 WCF 获得相同的行为?

这是我的配置

<system.serviceModel>
    <services>
      <service name="WorkflowLibrary1.Workflow1" behaviorConfiguration="WorkflowLibrary1.Workflow1.Service1Behavior">
        <endpoint address="" binding="wsHttpContextBinding" contract="WcfServiceLibrary1.IService1"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WorkflowLibrary1.Workflow1.Service1Behavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

【问题讨论】:

  • 代码在哪里?此外,WCF Web 服务。您指的是旧的 ASMX 技术吗?你该死的确实必须清理一个 ASMX 代理 - 如果你不这样做,它可能会以不同的方式失败。
  • 我知道我应该自己清理,但是基于这种新方式,如果有人与我们的服务集成并且没有正确关闭连接,基本上可能会导致我们的服务器崩溃!

标签: .net wcf web-services connection workflow-foundation


【解决方案1】:
  1. 首先阅读 -> 避免 Using 语句出现问题:http://msdn.microsoft.com/en-us/library/aa355056.aspx

  2. 如果您想要一个比上面链接提供的更强大的解决方案,我建议您这样做: http://bloggingabout.net/blogs/erwyn/archive/2006/12/09/WCF-Service-Proxy-Helper.aspx(代码) http://bloggingabout.net/blogs/erwyn/archive/2007/01/30/usage-of-the-wcf-serviceproxyhelper.aspx(用法/示例)

瞧!

【讨论】:

    【解决方案2】:

    这 5 个连接可能来自服务器 - 您可以通过服务器 serviceThrottling 行为来定义最大打开会话数、最大并发调用数和最大服务器实例数。

    同时,这是否会允许您增加同时打开的会话数,我仍然建议您自己适当清理 - 即使您在过去不需要这样做......

    我建议将您的客户端代理的使用包装到 using 语句中,如下所示:

    using(ClientProxy proxy = new ClientProxy())
    {
       // go ahead, call your service methods
    }
    

    更新:正如评论者正确指出的那样,这存在一些问题,因为客户端可能会在处理时抛出异常。因此,这可能并不能很好地工作 - 或者您需要将 try...catch 包裹起来以处理关闭客户端代理导致问题的情况。

    Avoiding Problems with the Using Statement


    这样,当 using 块的范围结束时,客户端代理会自动关闭和处置,并且您从客户端到服务器的通道被释放,服务器准备好接收来自另一个客户端的另一个调用。

    同样使用 wsHttpContextBinding 你应该检查你是否真的需要默认开启的会话——推荐的最佳实践是在服务器上使用 per-call 实例化,例如每个调用者都实例化一个新的服务器对象。会话会引入大量新问题和潜在陷阱,因此我会尝试仅在真正需要(并从中受益)时使用它们 - 否则会关闭会话。

    马克

    【讨论】:

    • 我不会将代理放在 using 语句中,因为 WCF 已损坏并且 dispose 会抛出。使用 try/catch/finally/ 最后使用 try/catch 关闭通道,如果它抛出,则中止它。
    • 让我添加更多详细信息,何时以及是否使用所有连接并且在完成后不关闭它们,如果我转到服务器并查看 asp.net 应用程序的 perfmon,我可以看到有一个请求设置为处理并且没有更多的请求能够通过,我还没有找到任何方法让服务器接受除resetiis之外的更多请求。我只是觉得很难相信 WCF 会让服务器如此容易接受客户端的不良做法。基于此,单个客户端甚至无需尝试即可对您的服务器执行 DOS。
    • Kay:这可能是真的——但如果你有五个客户端已经连接,建立了一个会话,并且没有正确关闭,那么你将有五个打开服务器的会话,那就是服务器限制的默认限制。
    • 这个答案是不正确的 - 阅读这个:避免使用语句msdn.microsoft.com/en-us/library/aa355056.aspx的问题
    【解决方案3】:

    还可以查看WCF Dynamic Client Proxy。它会在您的代理之后自动清理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多