如何让WCF自动关闭连接?

4
当我使用内置的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 代理 - 如果不这样做,可能会以不同的方式失败。 - John Saunders
我知道应该自己清理干净,但是基于这种新方式,如果有人集成我们的服务并且没有正确关闭连接,就可能会导致服务器崩溃! - kay.one
3个回答

2

1

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

同时,虽然这将允许您增加并发打开会话的数量,但我仍建议您在使用后进行适当的清理 - 即使在旧时代您不必这样做.....

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

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

更新:正如评论者所指出的那样,这种方法存在问题,因为客户端在被处理后可能会抛出异常。因此,这种方法可能并不是很有效,或者您需要在其周围包装一个try...catch来处理关闭客户端代理引起问题的情况。

请参见避免使用语句时出现的问题


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

此外,使用wsHttpContextBinding时,应检查是否真正需要默认启用的会话 - 推荐的最佳实践是在服务器上使用每个调用实例,例如,每个呼叫者实例化一个新的服务器对象。会话引入了许多新问题和潜在陷阱,因此我建议只在必须时(并从中获得好处)才使用它们 - 否则关闭会话。

Marc


3
我不会在using语句中放置代理,因为WCF存在缺陷,可能会导致dispose()方法抛出异常。应该使用try/catch/finally结构,在finally块中使用try/catch结构关闭通道,并且如果它抛出异常,则应该中止它。 - Krzysztof Kozmic
让我补充更多细节,如果我使用了所有连接并在完成后没有关闭它们,如果我去服务器并查看 asp.net 应用程序的 perfmon,我可以看到有一个单独的请求设置为处理中,没有更多的请求能够通过,我没有找到任何方法使服务器接受更多请求,除了 resetiis。我只是觉得很难相信 WCF 会使服务器对客户端不良实践如此脆弱。基于这个问题,单个客户端甚至不需要尝试就可以 DOS 您的服务器。 - kay.one
Kay:这可能是真的 - 但如果您有五个已连接、建立了会话但未正确关闭的客户端,则会有五个与服务器打开的会话,并且这是服务器限制的默认限制。 - marc_s
3
此答案错误,请阅读以下内容: 避免使用语句出现问题 http://msdn.microsoft.com/zh-cn/library/aa355056.aspx - Wagner Danda da Silva Filho

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接