6

我正在使用两个应用程序,一个具有配置为使用 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。我即将放弃并更改代码,因此每个线程都有自己的频道,希望这可以解决问题,但我想知道为什么会发生这种情况。如果有人知道我做错了什么或者可以指出我正确的方向以继续调查,那将很有帮助。

4

1 回答 1

1

默认情况下,Windows 不启用端口共享。我会检查您是否已正确启用它(请参阅此处)。

如果可能,您还可以尝试更改一个应用程序的端口,或者在 VM 中测试一个应用程序。

此外,对于可能遇到相同问题的任何其他人,请按照 Diego 所做的那样检查配置中是否启用了端口共享。添加portSharingEnabled="true"到绑定:

<system.serviceModel>
  <bindings>
    <netTcpBinding name="portSharingBinding" 
                   portSharingEnabled="true" />
  <services>
    <service name="MyService">
        <endpoint address="net.tcp://localhost/MyService"
                  binding="netTcpBinding"
                  contract="IMyService"
                  bindingConfiguration="portSharingBinding" />
    </service>
  </services>
</system.serviceModel>

取自:http: //msdn.microsoft.com/en-us/library/ms731810.aspx

于 2012-04-12T15:59:31.777 回答