我在 azure Web 应用程序上托管 asp.net Web api
。该应用托管在 2 个并排的 Azure Web 应用实例上。
但是最近我们的峰值请求有所增加,并且我们开始在日志中看到以下错误:
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full
在我们的网络服务器中,我们使用 HttpClinet
向其他服务器发出许多短暂的 http post 请求。根据我对上述错误代码的研究,底层操作系统似乎耗尽了“用户”TCP 端口。我首先认为这是 HttpClient .net 库的一些错误。不过,我们尝试了 HttpClient
的 static
实例以及 using dispose
方法。都不能解决我们的问题。唯一有帮助的是我们每小时手动重新启动网络应用程序,这绝对不是一个长期的解决方案。
我无法在 Azure Web 应用程序上运行“netstat”来查看套接字发生的情况。
我们每天处理的请求数量大约为 100 000 个。这不应该使一台机器重载,更不用说两台机器了。所以一定是出了什么问题。
我们如何解决这个问题?
我有一些问题:
- httpclient 是否可以胜任这项工作,这项工作需要处理数千个 http post 请求?
- 是否有办法强制
HttpClient
使用http2
,它将在单个 tcp 套接字上执行多个请求。 - 还有哪些其他技术选择?本质上,我们希望将 json 对象从一台服务器发送到另一台服务器,并获取 json 对象作为响应。像
azure service
总线这样的东西会在有多个套接字并通过这些套接字推送许多请求的情况下工作吗?
最佳答案
我刚刚遇到这个问题,似乎当您到达大于 5000 的 TCP 端口时,会引发错误,并给出与您相同的异常(如果您每天发送 100000 个请求,那么打开超过 5000 个请求是很自然的一次性端口)
还有一种修复方法,即在注册表编辑器中的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
中添加 MaxUserPort
(DWORD 值类型)
另外更改 MaxUserPort
可能会解决您的问题,但它会产生另一个问题,特别是如果您通过打开大量端口而受到 TCP 攻击而导致系统崩溃,因此最好选择最大端口数谨慎值(这就是为什么有这个设置)
注意:您也可以使用 Tcp 客户端,但是需要手动构建 http 请求,最好坚持使用 http 客户端
关于c# - Web 服务器上的 System.Net.Http.HttpRequestException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56209782/