【问题标题】:WCF: EndpointNotFoundException after running for a couple of secondsWCF:运行几秒钟后出现 EndpointNotFoundException
【发布时间】:2012-04-12 14:44:07
【问题描述】:

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

【问题讨论】:

  • 这两个应用程序的端口是什么?你试过running a trace,或者检查过港口预订吗?您还可以运行tcpview 并监控两个应用程序的 tcp 连接。
  • 两个应用程序使用的端口是默认的net.tcp端口,808。我会尝试tcpview应用程序来监控连接,谢谢!
  • 默认情况下,Windows 不启用端口共享。我会检查您是否已正确启用它 (see here)。如果可能,您还可以尝试更改一个应用程序的端口,或者在 VM 中测试一个。
  • @JimSchubert 我忘了说,端口共享已启用。我会更新问题,谢谢!
  • @JimSchubert 在编辑我的问题时我意识到我在 Windows 中启用了 Net.Tcp 端口共享服务,但我没有添加绑定配置来启用 WCF 服务的端口共享。一旦我这样做了,它就开始工作了:D如果您愿意,请将您的评论作为答案,以便我接受。谢谢!

标签: c# wcf


【解决方案1】:

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

如果可能,您还可以尝试更改一个应用程序的端口,或在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多