如何使用Net.TCP从1个客户端实现对WCF服务的并发请求

时间:2016-02-19 11:20:10

标签: .net wcf

我有一个C#.Net IIS托管的WCF服务器和它的C#.Net WCF客户端。两者都支持HTTP(S)和Net.TCP协议。我们使用这两种协议得到了正确的结果。

由于服务器端处理的性质,如果服务器和单个客户端之间的一些请求同时发生,整体性能会更好。使用HTTP,这很好 - 通过监视服务器的活动,我可以看到它确实一次处理多个请求。但是使用Net.TCP,服务器端活动是顺序的 - 在当前请求完成之前,它不会在下一个请求上启动。

我希望Net.TCP能够使用与HTTP相同或更好的性能,但我需要解决这个并发执行问题。

服务器端配置代码段: -

<netTcpBinding>
    <binding name="ServiceLayerNetTcpBinding" maxReceivedMessageSize="20000000" portSharingEnabled="true">
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
</netTcpBinding>
...
<protocolMapping>
  ...
    <add scheme="net.tcp" binding="netTcpBinding" bindingConfiguration="ServiceLayerNetTcpBinding" />
</protocolMapping>

客户端程序化配置: -

var netTcpBinding = new NetTcpBinding(SecurityMode.Transport)
                                      {
                                          MaxReceivedMessageSize = MaxReceivedMessageSize,
                                          SendTimeout = TimeSpan.FromMinutes(SendTimeoutMinutes)
                                      };
        netTcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;

有人建议我需要做什么,使Net.TCP的行为与HTTP(S)相同,关于服务器上请求的并发执行?

1 个答案:

答案 0 :(得分:2)

我认为我发现了这个问题。

我的服务未使用显式ConcurrencyMode声明。所以他们默认为ConcurrencyMode = Single。但是,它们都设置为InstanceContextMode = PerCall。

似乎HTTP(S)和Net.TCP协议导致对此组合的不同解释。在HTTP(S)中,我们最终会同时激活多个服务实例,每个实例都处理一个请求。但是在Net.TCP中,它不会发生 - ConcurrencyMode.Single似乎“赢”,导致一次只处理一个请求。

但是,我的服务都是无状态的,因此可以愉快地将它们声明为ConcurrencyMode = Multiple,这会导致HTTP(S)和Net.TCP同时运行多个请求。

我很想知道这是否是HTTP(S)和Net.TCP绑定之间的一个众所周知和记录的差异,我应该知道,或者只能通过实验找到。