2010-05-23 121 views
4

我已经被这样定义的WCF服务:设置WCF服务调用

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 

结合使用NetTcpBinding的完成。

我们支持50多个不时致电服务器的客户端。 每个客户端在加载后使用channelfactory打开一个频道,并为所有呼叫使用该频道(仅创建频道和代理一次)。

我们建立了一个小型负载测试仪,通过一次调用50个不同的线程(使用50个不同的通道)来模拟客户端。 当我们运行这台测试仪时,第10个客户端尝试连接之后,所有其他客户端连接失败。 我们已经设置限制为100

我的问题是:

  1. 是正确的为每个客户建立一个通道,并使用它通过客户端的续航时间?或者,我是否需要为服务器的每次调用使用using语句(为每个调用创建和销毁一个新通道)。
  2. 服务是否有通道连接的限制?其他然后节流?

回答

0

您是否检查过服务器上的CAL限制?

如果你不使用某些东西,清理它通常是一个很好的习惯,所以我会把所有东西都粘在一个使用语句中。

+0

什么是CAL限制? 每个客户端每1分钟就会调用一次服务器(假定),您是否建议我在每次调用服务器时创建一个通道? – gash25 2010-05-23 13:12:15

+2

使用语句和wcf客户端.....不好http://msdn.microsoft.com/en-us/library/aa355056.aspx – redsquare 2010-05-24 05:57:13

+0

Doh!感谢那。 – Doobi 2010-05-24 12:28:37

4

到服务器的并发连接数受WCF服务限制行为以及您的机器(它确实是操作系统)控制。 Windows XP机器对10个并发连接有严格限制 - 这可能是问题吗?如果您在服务器上运行,则该限制不适用。

service throttling behavior也有MaxConcurrentSessions默认是10 - 和你的NetTcpBinding的连接都将有一个传输层会话去,所以这肯定也是一个问题。

您可以更改服务限制行为的设置,在您的应用程序的配置文件:

<serviceBehaviors> 
    <behavior name="TcpMoreThan10"> 
     <serviceThrottling 
     maxConcurrentCalls="100" 
     maxConcurrentSessions="50" 
     maxConcurrentInstances="50" /> 
    </behavior> 
    </serviceBehaviors> 

,你不得不这项服务行为添加到您的<service>标签,当然,来启用它:

<service name="....." behaviorConfiguration="TcpMoreThan10"> 
    .... 
</service> 

如果只有最多50个客户打电话偶尔,他们正在使用的所有“内部”客户NetTcpBinding的,我看不出有什么好的理由,为什么你想要做这件事情一多线程单身,真的。作为一个侧面提示:多线程单例不容易写,很难让一切正确,你需要担心对内部变量的并发访问等。 - 相当混乱的编程。

为什么不使用默认的每个呼叫实例模式?有了这样的:

  • 每个请求进来毒鼠强他自己的,单独的,孤立的,刚创建的服务类
  • 每个服务类实例永远只能处理只有一个来电者的实例,因此没有必要对混乱和复杂多线程编程模型
+0

由于性能,复杂和其他原因,我们的服务不可能使用每次通话。 您是否建议在每次客户呼叫后销毁频道?或使用相同的频道? – gash25 2010-05-23 13:41:14

+0

@ Gash25:实际上,每个调用的复杂度比拥有多线程单例要少得多......性能不应该是一个大问题,如果你的服务构造函数不是太复杂的话。 。 – 2010-05-23 21:29:30