如何让WCF自动关闭连接?

时间:2009-06-05 00:56:41

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

当我使用内置的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>

3 个答案:

答案 0 :(得分:2)

  1. 首先阅读 - &gt;避免使用声明的问题: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(使用/样本)

  3. 瞧!

答案 1 :(得分:1)

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

与此同时,这是否会让你增加同时开放的会话数量,我仍然会建议你自己清理一下 - 即使你没有在过去......

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

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

更新:正如评论员正确地指出的那样,这有问题,因为客户可能会在处置时抛出异常。所以这可能不是那么好 - 或者你需要在它周围包裹try...catch来处理关闭客户端代理导致问题的情况。

请参阅Avoiding Problems with the Using Statement


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

同样使用wsHttpContextBinding,您应该检查您是否确实需要默认启用的会话 - 建议的最佳做法是在服务器上使用每次调用实例化,例如:每个调用者实例化一个新的服务器对象。会话介绍了一大堆新问题和潜在的陷阱,所以我会尝试只在我真正需要的时候使用它们(并从中获益) - 否则关闭会话。

马克

答案 2 :(得分:1)

另请查看WCF Dynamic Client Proxy。它会在您的代理后自动清理。