2009-06-05 76 views
4

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

我知道你应该清理完自己,但我也知道你不需要使用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> 
+0

代码在哪里?另外,WCF是Web服务。你指的是旧的ASMX技术吗?你该死的_do_必须清理一个ASMX代理 - 如果你不这样做,它可能会以不同的方式失败。 – 2009-06-05 01:43:26

+0

我明白自己应该清理自己,但基于这种新方式,如果有人与我们的服务集成并且没有正确关闭连接,基本上可能会导致我们的服务器无法正常运行! – 2009-06-05 08:07:36

回答

1

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

与此同时,这将允许您增加同时打开的会话的数量,我仍然会建议您妥善清理自己 - 即使您不必在过去的日子里...... 。

我建议包装使用您的客户端代理的成using声明,如下所示:

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

更新:作为评注者所正确指出的,这有它的莎尔因为客户可能在被处置时抛出异常。所以这可能不是真的很好 - 或者你需要围绕它打包try...catch以处理客户端代理关闭导致问题的情况。

参见Avoiding Problems with the Using Statement


这样一来,客户端代理将自动关闭并设置当使用块端部的到服务器的范围,并从客户端的信道被释放,并且所述服务器是就绪接收另一个客户的另一个电话。

此外,使用wsHttpContextBinding,您应该检查您是否确实需要默认启用的会话 - 建议的最佳做法是使用服务器上的每次调用实例,例如,每个调用者实例化一个新的服务器对象。会议引入了一系列新问题和潜在的陷阱,所以我会尝试仅在真正需要(并从中受益)时才使用它们 - 否则关闭会话。

马克