C# HttpWebRequest端口耗尽

C# HttpWebRequest端口耗尽,c#,asp.net,.net,visual-studio,C#,Asp.net,.net,Visual Studio,我们正在使用Windows服务对内部REST服务进行非常频繁的HTTP调用(每秒20-40次调用),但请注意,在服务运行几分钟后,在获取响应时会出现很长的延迟 看看netstat,有相当多的端口处于“TIME\u WAIT”状态,看起来我们可能已经没有端口了 如何确保端口被重用?同时传出HTTP连接的数量是有限制的。在创建HttpWebRequest对象之前,可以通过使用System.Net.ServicePointManager.DefaultConnectionLimit静态属性来控制这一点

我们正在使用Windows服务对内部REST服务进行非常频繁的HTTP调用(每秒20-40次调用),但请注意,在服务运行几分钟后,在获取响应时会出现很长的延迟

看看netstat,有相当多的端口处于“TIME\u WAIT”状态,看起来我们可能已经没有端口了


如何确保端口被重用?

同时传出HTTP连接的数量是有限制的。在创建
HttpWebRequest
对象之前,可以通过使用
System.Net.ServicePointManager.DefaultConnectionLimit
静态属性来控制这一点

将其设置为比默认值(我认为是2)更高的值可能是值得的


如果这没有帮助,那么您还可以增加默认的
线程池大小,以便更快地创建更多请求。线程池只会逐渐增加它的线程数-每半秒一个新线程,IIRC

我们如何确保端口被重用?不要将连接限制设置为几乎可以保证不会发生连接的值

看起来有人在某个时候对ServicePointManager进行了欺骗。我将限制此来源的ServicePoint:以鼓励http管道和连接重用:

ServicePointManager.FindServicePoint(Uri).ConnectionLimit = someSensibleValue;

这可能与许多用户在使用HttpClient类和内部使用HttpClient的类时遇到的相同问题有关。由于HttpClient实现了IDisposable接口,您会发现许多开发人员迫切需要将该类的任何新实例包装到using语句中。这只是一个问题;当HttpClient对象被释放时,连接的端口将保持阻塞状态5分钟,直到操作系统释放它们


我通常使用单个HttpClient实例(singleton),并将完全限定的URL与异步调用结合使用

谢谢,但是我们已经在web.config文件中设置了以下内容:另外,我们在提交请求时运行了跟踪,GetRequestStream()平均为0-1毫秒,而GetResponse()方法有时需要60000毫秒+。我们可以看到,在接收端处理响应的时间少于1000毫秒,因此瓶颈在发送端。@user2966445您是否确保在处理完所有响应后处理它们?如果您这样做,那么默认情况下C#应该重新使用相同的基础网络连接(不是相同的请求,但这是不可能的)。我们已经尝试在配置文件中设置最大连接数:@user2966445,因此,临时端口的范围从49152到65535。。。或16383。可以想象,使用如此高的值可能会使您精疲力竭。为什么这个主机需要超过10个?最佳情况下,您同时有多少个未响应的请求?在通常情况下,您不需要比该值更多的连接。可以重用连接(除非远程主机是http1.0,发出
connection:close
headers或终止连接)。如此高的值将是有害的,因为不会重用连接,它们将过期并接近等待时间。您是否在请求实例完成后处理它们?您是否也使用了许多线程?这确实是一个性能问题。。。你已经把注意力集中在这个问题上了。。。我不相信是这样。我想说,这很可能是另一个问题的症状。共享用于发出请求的代码对于了解您是否正在执行阻止重新使用连接的操作是非常必要的。@user2966445如果您每秒发出20-40个调用,并且完成这些调用不超过1秒,然后我建议您将连接限制设置为大约50-60范围。如果您仍然是瓶颈,我建议您的问题在其他地方,提高连接限制并不是您问题的答案(例如,服务器上的请求限制导致排队、无法正确终止和处理请求以便重新使用连接等等…)