我有一个 WCF 服务和一个 Web 应用程序。 Web 应用程序以连续方式(也称为轮询)调用此 WCF 服务。在我们的生产环境中,我很少收到此错误。因为,这是一个内部活动,用户不知道何时抛出此错误。
无法连接到http://localhost/QAService/Service.svc http://localhost/QAService/Service.svc。
TCP 错误代码 10048:只有一种用法
每个套接字地址
(协议/网络地址/端口)是
通常允许 127.0.0.1:80。 --->
System.Net.WebException:无法
连接到远程服务器 --->
System.Net.Sockets.SocketException:
每个套接字地址只能使用一次
(协议/网络地址/端口)是
通常允许 127.0.0.1:80
我在我们的开发/质量保证环境中重现这种行为时遇到了麻烦。我已确保客户端连接在 try..catch..finally 块中关闭。仍然不明白是什么导致了这个问题..有人知道这一点吗?
Note: 我看过这个所以问题 https://stackoverflow.com/questions/828864/continuous-rapid-calls-to-wcf-service-returns-a-only-one-usage-of-each-socket-a,但似乎没有回答我的问题,所以不是重复的问题。
TCP/IP 堆栈超载。 Windows(我认为实际上所有套接字堆栈)对可以快速打开的套接字数量有限制,因为套接字在正常操作下如何关闭。每当套接字关闭时,它就会进入 TIME_WAIT 状态一段时间(240 秒 IIRC)。每次轮询时,都会消耗一个超出默认动态范围的套接字(我认为大约有 5000 个动态端口,略高于 1024),并且每次轮询结束时,该特定套接字都会进入 TIME_WAIT。如果轮询足够频繁,最终将消耗所有可用端口,这将导致 TCP 错误 10048。
一般来说,WCF 会尝试通过池化连接等方式来避免此问题。对于不通过互联网传输的内部服务,通常会出现这种情况。我不确定 wsHttp 绑定是否支持连接池,但 netTcp 绑定应该支持。我认为命名管道不会遇到这个问题。我不能说 MSMQ 绑定。
您可以使用两种解决方案来解决此问题。您可以增加动态端口范围,或减少 TIME_WAIT 的周期。前者可能是更安全的路线,但如果您消耗大量套接字(这听起来不像您的场景的情况),减少 TIME_WAIT 是一个更好的选择(或两者兼而有之。)
更改动态端口范围
- 打开注册表。
- 打开 HKLM\System\CurrentControlSet\Services\Tcpip\Parameters 项
- 编辑(或创建为 DWORD)MaxUserPort 值。
- 将其设置为更高的数字。 (即 65534)
更改 TIME_WAIT 延迟
- 打开注册表。
- 打开 HKLM\System\CurrentControlSet\Services\Tcpip\Parameters 项
- 编辑(或创建为 DWORD)TcpTimedWaitDelay。
- 将其设置为较低的数字。值以秒为单位。 (即 60 延迟 1 分钟)
上述解决方案之一应该可以解决您的问题。如果更改端口范围后它仍然存在,我会尝试增加轮询的周期,这样它发生的频率就会降低......这将为您提供更多的余地来解决时间等待延迟。作为最后的手段,我会改变时间等待延迟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)