C#:如何提升HttpWebRequest的并发连接数?
解决多线程HttpRequest客户端连接数受限的问题
我之前在做类似的多线程HTTP请求工具时也踩过这个坑,明明设置了连接数限制但就是不生效,折腾了好一阵才找到几个关键的排查点,你可以逐一试试:
1. 确认ServicePointManager.DefaultConnectionLimit的设置时机
这个设置必须在第一个HTTP请求发出之前执行,否则.NET会为目标域名创建默认的ServicePoint实例,后续修改全局的DefaultConnectionLimit不会影响已经存在的ServicePoint。比如在控制台应用里,要把它放在Main方法的最开头:
static void Main(string[] args) { // 先设置全局连接限制 ServicePointManager.DefaultConnectionLimit = 100; // 再初始化你的多线程请求逻辑 StartMultiThreadRequests(); }
2. 手动指定目标域名的ServicePoint连接数
如果你的请求都是指向同一个域名,直接针对该域名的ServicePoint单独设置连接数会更可靠,避免全局设置被覆盖:
Uri targetDomain = new Uri("https://your-target-website.com"); ServicePoint servicePoint = ServicePointManager.FindServicePoint(targetDomain); // 强制设置该域名的最大连接数 servicePoint.ConnectionLimit = 100;
每个域名对应一个ServicePoint实例,它的连接数优先级高于全局的DefaultConnectionLimit,所以直接修改它能确保生效。
3. 检查请求的超时时间设置
有时候不是连接数不够,而是请求的Timeout设置太短,导致排队的请求还没轮到就超时了。可以把超时时间调大试试:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetUrl); // 设置为60秒(根据实际场景调整,比如文件下载可能需要更长时间) request.Timeout = 60000;
4. 验证配置文件的正确性
如果用配置文件设置,要确保配置节放在<configuration>根节点下,并且文件名正确(控制台应用应为YourAppName.exe.config,Web应用是web.config):
<configuration> <system.net> <connectionManagement> <!-- 注意属性名是maxconnection(全小写) --> <add address="*" maxconnection="100" /> </connectionManagement> </system.net> </configuration>
如果配置文件格式错误或者路径不对,.NET会忽略这些设置,回到默认的连接数限制。
5. 排除目标服务器的限制
有些网站会对单个IP的并发请求数做限制,即使你这边放开了连接数,对方服务器也会拒绝多余的请求,表现为超时。可以用curl或者Postman同时发起多个请求测试,如果同样出现失败,那大概率是服务器端的限制,这时候需要调整请求频率或者使用代理IP。
内容的提问来源于stack exchange,提问作者Abdul
相关产品推荐
相关产品推荐

