我已经制作了一个WCF服务,其定义如下:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
使用netTcpBinding完成绑定。
我们支持50多个不时呼叫服务器的客户端。 每个客户端在加载后使用channelfactory打开一个频道,并将该频道用于所有呼叫(仅创建频道和代理一次)。
我们已经构建了一个小型负载测试器,它通过50个不同的线程同时调用服务器来模仿客户端(使用50个不同的通道)。 当我们运行此测试程序时,在第10个客户端尝试连接后,所有其他客户端都无法连接。 我们将限制设置为100。
我的问题是:
答案 0 :(得分: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的“内部”客户端,我认为没有任何理由可以让您将这个东西变成多线程单例,真的
作为旁注:多线程单例难以编写,难以使一切正确,您需要担心并发访问内部变量等等 - 相当混乱的编程。
为什么不使用默认的每次调用实例模式?有了这个:
答案 1 :(得分:0)
您是否检查过服务器上的CAL限制?
如果你没有使用某些东西,清理一般是一种很好的做法,所以我会把所有内容都放在一个使用声明中。