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

标签 .net wcf

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

由于服务器端处理的性质,如果同时在服务器和单个客户端之间发送一些请求,则整体性能会更好。使用 HTTP,这工作正常——通过监视服务器的事件,我可以看到它确实在同时处理多个请求。但是使用 Net.TCP,服务器端事件是顺序的 - 它不会在当前请求完成之前从下一个请求开始。

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

服务器端配置片段:-

<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) 相同?

最佳答案

我想我找到了问题。

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

似乎 HTTP(S) 和 Net.TCP 协议(protocol)导致了对这种组合的不同解释。在 HTTP(S) 中,我们最终会同时激活一个服务的多个实例,每个实例都处理一个请求。但在 Net.TCP 中,情况并非如此 - ConcurrencyMode.Single 似乎“获胜”,导致一次只处理一个请求。

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

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

关于.net - 如何使用 Net.TCP 从 1 个客户端实现对 WCF 服务的并发请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35504063/

相关文章:

iPhone 应用程序因 Mprotect 失败错误而崩溃 (MonoTouch)

wcf - ado.net 数据服务相对于 WCF 服务的优点/缺点

wcf - 使用WCF进行串口通信?

.net - DNS GetHostEntry - 如何指定 DNS 服务器? 。网

.net - Visual Studio 2012 RC 因 .NET Framework 中的异常而中断。如何让它只在我的代码中出现异常?

c# - 获取同名方法的集合

c# - 我应该使用 WCF 还是原始套接字?

使用 WSHttpBinding 时 WCF 并发请求堆积在服务器上

.net - 使用 Visual Basic 6 中的 .NET 类的最佳方法是什么?

.net - System.environment的扩展方法