WCF:运行几秒钟后出现 EndpointNotFoundException
本文关键字:EndpointNotFoundException 几秒 运行 WCF | 更新日期: 2023-09-27 18:31:05
我正在使用两个应用程序,其中一个具有配置为使用 net.tcp 绑定的自托管服务。服务的 ServiceBehaviorAttribute 配置有:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single,
IncludeExceptionDetailInFaults = true,
UseSynchronizationContext = false,
ValidateMustUnderstand = false)]
对于服务和客户端,传输模式设置为"流式处理",超时为:
closeTimeout="00:01:00"
openTimeout="00:00:30"
receiveTimeout="00:02:30"
sendTimeout="00:02:30"
最大连接数设置为 500,并且服务限制行为使用 WCF 4 默认值:
- 最大并发会话数:100 * 处理器计数
- 最大并发调用数:16 * 处理器计数
- 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。我即将放弃并更改代码,以便每个线程都有自己的通道,希望这可以解决问题,但我想知道为什么会发生这种情况。如果有人知道我做错了什么,或者可以指出我正确的方向继续调查,那将是有帮助的。
默认情况下,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