为多个客户端调用设置WCF服务

时间:2010-05-23 12:06:21

标签: c# wcf proxy

我已经制作了一个WCF服务,其定义如下:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
使用netTcpBinding完成

绑定。

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

我们已经构建了一个小型负载测试器,它通过50个不同的线程同时调用服务器来模仿客户端(使用50个不同的通道)。 当我们运行此测试程序时,在第10个客户端尝试连接后,所有其他客户端都无法连接。 我们将限制设置为100。

我的问题是:

  1. 每个客户创建一个频道并在整个客户端使用它是否正确?或者,我是否需要为服务器的每次调用使用using语句(为每次调用创建和销毁新频道)。
  2. 该服务是否限制了与它的通道连接?然后再节流?

2 个答案:

答案 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限制?

如果你没有使用某些东西,清理一般是一种很好的做法,所以我会把所有内容都放在一个使用声明中。