我正在使用两个应用程序,一个具有配置为使用 net.tcp 绑定的自托管服务。服务的 ServiceBehaviorAttribute 配置为:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single,
IncludeExceptionDetailInFaults = true,
UseSynchronizationContext = false,
ValidateMustUnderstand = false)]
对于服务和客户端,transferMode 都设置为 Streamed,超时时间为:
closeTimeout="00:01:00"
openTimeout="00:00:30"
receiveTimeout="00:02:30"
sendTimeout="00:02:30"
MaxConnections 设置为 500,ServiceThrottlingBehavior 使用 WCF 4 默认值:
- MaxConcurrentSessions:100 * ProcessorCount
- MaxConcurrentCalls:16 * ProcessorCount
- MaxConcurrentInstances:默认是以上两个的总和,跟之前的模式一样。
我使用的是四核机器并且启用了 Net.Tcp 端口共享服务。
客户端应用程序有一个使用 ChannelFactory 类创建的服务的单一通道。一旦创建了通道,就会产生 100 个线程。每个线程使用通道以每秒一条消息的频率向服务器发送消息。
运行正常几秒钟后(客户端将消息发送到服务器并正确接收它们)抛出 EndpointNotFoundException 并显示以下消息:
Could not connect to net.tcp://localhost/service. The connection attempt lasted
for a time span of 00:00:02.1777100. TCP error code 10061: No connection could
be made because the target machine actively refused it 127.0.0.1:808.
奇怪的是:
- 如果我在同一台机器上运行两个应用程序,则异常的时间跨度约为 2 秒,但如果我在我的机器上运行服务器应用程序,而在另一台机器上运行客户端应用程序,则异常的时间跨度始终为 1 秒。
- 有时(如十分之一)不会抛出异常,并且两个应用程序都可以正常工作。
- 在抛出异常之前,服务器接收消息并正确处理它们。服务器中不会抛出异常。
我做了很多测试,减少线程数量,增加线程数量,将关闭、打开、接收和发送超时更改为更低和更高的值,为 maxConnections 设置更高的值但结果始终相同,在某些时候抛出 EndpointNotFoundException。我即将放弃并更改代码,因此每个线程都有自己的频道,希望这可以解决问题,但我想知道为什么会发生这种情况。如果有人知道我做错了什么或者可以指出我正确的方向以继续调查,那将很有帮助。