我有一个 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/