我们正在使用Windows服务对内部REST服务进行非常频繁的HTTP调用(每秒20-40次调用),但是注意在服务运行几分钟后获得响应的时间很长。
看看netstat,有很多端口处于“TIME_WAIT”状态,看起来我们的端口可能已经用完了。
我们如何确保端口可以重复使用?
答案 0 :(得分:2)
同时传出HTTP连接的数量有限制。您可以在创建System.Net.ServicePointManager.DefaultConnectionLimit
对象
HttpWebRequest
静态属性来控制此操作
将此值设置为高于我认为为2的默认值可能是值得的。
如果这样做无效,那么您还可以增加默认ThreadPool
大小,以便更快地创建更多请求。线程池只逐渐增加其线程数 - 每半秒一个新线程,IIRC
答案 1 :(得分:2)
这可能与许多用户在使用HttpClient类以及内部使用HttpClient的类时遇到的同一问题有关。 HttpClient实现IDisposable接口的结果是,您会发现许多开发人员都渴望将类的任何新实例包装在using语句中。这只是一个问题。当HttpClient对象被处理掉时,附加的端口将被“ TIME_WAIT”阻塞5分钟,直到它们被操作系统释放。
我通常使用单个HttpClient实例(单例),并将完全限定的URL与异步调用结合使用。
答案 2 :(得分:0)
我们如何确保端口可以重复使用?没有将连接限制设置为几乎可以保证他们不会成为的值。
在某些时候,似乎有人在使用ServicePointManager。我为这个来源限制了ServicePoint:鼓励http流水线和连接重用:
ServicePointManager.FindServicePoint(Uri).ConnectionLimit = someSensibleValue;