我正在azure网络应用程序上托管asp.net web api
。该应用程序托管在azure Web应用程序的2个并排实例中。
但是最近我们的高峰请求增加了,我们开始在日志中看到以下错误:
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
在我们的Web服务器中,我们使用HttpClinet
向其他服务器发出了许多短暂的http发布请求。根据我对上述错误代码的研究,似乎底层操作系统已用完“用户” TCP端口。我首先以为这是HttpClient
.net库中的错误。但是,我们尝试了static
的{{1}}实例以及HttpClient
方法。都不能解决我们的问题。唯一有用的是我们每个小时手动重新启动Web应用程序,这绝对不是一个长期解决方案。
我无法在azure Web应用程序上运行'netstat'来查看套接字发生了什么。
我们每天要处理的请求数量约为10万。这不应该使一台机器过载,不要在意两台机器。所以一定是很错误的。
我们如何解决此问题?
我有一些问题:
using dispose
使用HttpClient
的地方,它将在单个tcp套接字上执行多个请求。http2
这样的总线能在几个插座并通过这些插座推送许多请求的地方工作吗?答案 0 :(得分:1)
我刚遇到这个问题,看来当您到达大于5000的TCP端口时,会引发错误,并给出与您相同的异常(如果每天发送100000个请求,则自然会打开5000个以上的请求端口一次)
还有一种解决方法,可以在MaxUserPort
的注册表编辑器中添加HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
(DWORD值类型)
也更改MaxUserPort
可能会解决您的问题,但是这会导致另一个问题,特别是如果您通过打开许多端口使系统崩溃而收到TCP攻击时,那么最好谨慎选择一个最大值(这就是为什么有此设置的原因)
注意:您也可以使用Tcp客户端,但随后需要手动构建http请求,最好坚持使用http客户端