WCF:运行几秒钟后出现EndpointNotFoundException

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异常。我快要放弃并更改代码,使每个线程拥有自己的通道,希望这能解决问题,但我想知道为什么会发生这种情况。如果有人知道我做错了什么或可以指引我继续调查,那将很有帮助。

这两个应用程序的端口是什么?你尝试过运行跟踪或检查端口保留吗?你也可以运行tcpview并监视两个应用程序的TCP连接。 - Joseph Yaduvanshi
两个应用程序使用的端口都是默认的 net.tcp 端口,808。我将尝试使用 tcpview 应用程序来监视连接,谢谢! - Diego
默认情况下,Windows 不启用端口共享。我建议您检查是否已正确启用它(请参见此处)。如果可能的话,您还可以尝试更改一个应用程序的端口,或在虚拟机中进行测试。 - Joseph Yaduvanshi
@JimSchubert,我忘了提到它,端口共享已启用。我会更新问题,谢谢! - Diego
@JimSchubert 在编辑我的问题时,我意识到我启用了 Windows 中的 Net.Tcp 端口共享服务,但我没有添加绑定配置以启用 WCF 服务的端口共享。一旦我这样做了,它就开始工作了 :D 如果您想的话,请将您的评论作为答案,这样我就可以接受它。谢谢! - Diego
太棒了,我很高兴它起作用了。我发布了配置细节,以防其他人遇到相同的问题但不知道配置值。 - Joseph Yaduvanshi
1个回答

1

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

如果可能的话,您还可以尝试更改一个应用程序的端口,或在虚拟机中进行测试。

此外,对于可能遇到相同问题的其他人,请像 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/zh-cn/library/ms731810.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接