C# 中最大化 HttpWebRequest 性能实现高效并发请求

前言

在C#中使用HttpWebRequest发起HTTP请求时,达到最大并发和性能可以从以下几个方面改进:

1、ServicePointManager设置

ServicePointManager 类是一个静态类,它提供了用于管理HTTP连接的属性和方法。

为了提升并发性能,你需要调整以下几个关键属性:

DefaultConnectionLimit : 默认情况下,.NET Framework的ServicePointManager限制了对同一域名的并发连接数(通常是2)。你可以通过提高这个限制来允许更多的并发连接。

cs 复制代码
ServicePointManager.DefaultConnectionLimit = 100; 
// 一个合适的值,例如100

Expect100Continue : 当你发送一个POST请求时,.NET会先发送一个包含Expect: 100-continue头部的请求,询问服务器是否愿意接受数据。禁用此选项可能会提高性能。

cs 复制代码
ServicePointManager.Expect100Continue = false;

ReusePort: 这是.NET Core中的一个设置,如果你使用.NET Core,开启这个设置可以让不同的HTTP请求重用相同的本地端口。

cs 复制代码
ServicePointManager.ReusePort = true;

2、异步编程模型

使用HttpWebRequest的异步方法,如BeginGetResponseEndGetResponse或者GetResponseAsync,可以让你的应用程序在等待HTTP响应时不会阻塞,这对于提高并发性能非常重要。

3、资源利用和释放

确保在请求完成后及时释放HttpWebResponse对象和其他资源,以避免不必要的资源占用和内存泄漏。

cs 复制代码
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
// 处理响应 
}

4、并行处理

在.NET中,可以使用Parallel类或者Task类来并行发送多个请求。

cs 复制代码
var tasks = urls.Select(url => Task.Run(() => 
{ 
// 使用HttpWebRequest发送请求 
})).ToArray(); 
Task.WaitAll(tasks); 
// 等待所有请求完成

5、使用HttpClient

如果可能,考虑使用HttpClient类来代替HttpWebRequestHttpClient是一个更现代的HTTP客户端,它提供了更简洁的API,更好的异步支持,并且默认就配置了更高的并发连接限制。

cs 复制代码
using (var client = new HttpClient()) { // 发送请求 }

6、系统级配置

有时候,操作系统级别的设置也会对HTTP并发性能产生影响。例如,在Windows上,可能需要调整注册表中的MaxUserPortTcpTimedWaitDelay值来增加可用的端口数量和减少端口释放前的等待时间。

在Windows操作系统中,MaxUserPort 是一个注册表项,用于确定可用的最大用户端口号。

默认情况下,MaxUserPort 的值通常设置为 5000,这意味着TCP/IP协议栈会使用1024到5000之间的端口号用于用户的TCP/UDP连接。

如果你需要调整 MaxUserPort 的值(比如,你想要允许更多的并发网络连接),你可以通过注册表编辑器(regedit)进行修改。

通常,MaxUserPort 的值位于以下注册表路径:

cs 复制代码
HKEY_LOCAL_MACHINESystemCurrentControlSetServicesTcpipParameters

在修改 MaxUserPort 值后,通常需要重启Windows操作系统来使更改生效,因为TCP/IP堆栈需要重新加载配置参数。

对于高并发应用,MaxUserPort 值可以设置得更高,以允许系统打开更多的动态端口。

理论上,这个值可以设置到 65534 (因为 0 到 1023 是保留端口,而 65535 是最大端口号),但实际上,推荐的最大值通常会低于这个理论上限。

在实践中,很多Windows服务器管理员可能会将 MaxUserPort 设置在 10000 到 60000 之间,具体数值取决于应用需求以及系统和网络环境。

微软官方文档曾建议可以将 MaxUserPort 设置为 32768,但这并不是一个硬性限制,实际应用中应根据具体情况进行设置。

设置 MaxUserPort 时应当谨慎,因为非常高的值可能会导致系统资源(例如内存和句柄等)的消耗增加。

此外,这种改变可能会影响到网络安全策略。因此,最好在调整这个值之前评估应用的实际需求,并在测试环境中进行充分测试。

在修改 MaxUserPort 后,你需要重启系统以使设置生效。

同时,建议配合 TcpTimedWaitDelay 注册表项一起调整,这可以帮助更快地回收处于 TIME_WAIT 状态的端口,从而允许系统再次使用这些端口。

默认情况下,TcpTimedWaitDelay 的值为 240 秒,但可以减少到 30-60 秒,特别是在高并发环境中,这样可以帮助减少因为端口耗尽导致的连接问题。

TcpTimedWaitDelay 是Windows注册表中的一个项,用于控制TCP连接关闭后,其端口进入TIME_WAIT状态的时间。

TIME_WAIT状态是TCP连接断开后的一种保持状态,用于确保最后的确认包能够到达。这个时间默认是240秒。

减少 TcpTimedWaitDelay 的值可以加快端口的回收速度,这对于那些需要处理大量短连接的高并发应用是有益的。

对于 TcpTimedWaitDelay,典型的设置值介于30秒到120秒之间。

要设置 TcpTimedWaitDelay,请按照以下步骤:

1、打开注册表编辑器(regedit)。这可以通过在开始菜单中搜索"regedit"或者按 Win + R 键打开运行窗口,然后输入 regedit 并回车来完成。

2、导航到以下路径:

cs 复制代码
HKEY_LOCAL_MACHINESystemCurrentControlSetServicesTcpipParameters

3、查找 TcpTimedWaitDelay 键值。如果它不存在,你需要创建它:

4、右键点击 Parameters 目录,选择 新建 -> DWORD (32位) 值

5、将新创建的键值命名为 TcpTimedWaitDelay

6、双击 TcpTimedWaitDelay 键值,然后在"数值数据"框中输入你希望设置的秒数(请确保你选择了十进制而不是十六进制)。

7、点击"确定"保存更改。

8、关闭注册表编辑器。

9、为了使更改生效,你需要重启你的计算机。在调整 TcpTimedWaitDelay 之前,请确保你了解更改的影响,并且在生产环境中进行更改前在测试环境中进行了充分测试。不恰当的设置可能会导致不预期的行为,例如潜在的网络问题或性能下降。

7、服务器设置客户端性能的提升也依赖于服务器端的配置。确保服务器能够处理高并发连接和请求。

8、性能测试使用压力测试工具(如JMeter或LoadRunner)对你的应用程序进行压力测试,以确定最佳的并发设置。通过测试可以发现性能瓶颈,并据此调整设置。

注意事项

1、设置ServicePointManager.DefaultConnectionLimit过高可能会导致服务器压力增大,甚至拒绝服务,应根据实际情况谨慎设置。

2、在高并发场景中,HttpClient通常是比HttpWebRequest更好的选择。

3、使用异步编程模式时,确保理解async和await关键字,避免常见的陷阱,如死锁。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:Eric zhou

出处:cnblogs.com/tianqing/p/17868395.html

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

相关推荐
武子康10 分钟前
大数据-145 Apache Kudu 架构与实战:RowSet、分区与 Raft 全面解析
大数据·后端·nosql
间彧11 分钟前
Spring @ControllerAdvice详解与应用实战
后端
间彧15 分钟前
@ControllerAdvice与AOP切面编程在处理异常时有什么区别和各自的优势?
后端
一抓掉一大把38 分钟前
.net实现秒杀商品(Redis高并发)
.net
间彧39 分钟前
什么是Region多副本容灾
后端
爱敲代码的北40 分钟前
WPF容器控件布局与应用学习笔记
后端
爱敲代码的北40 分钟前
XAML语法与静态资源应用
后端
清空mega42 分钟前
从零开始搭建 flask 博客实验(5)
后端·python·flask
爱敲代码的北1 小时前
UniformGrid 均匀网格布局学习笔记
后端
一只叫煤球的猫1 小时前
从1996到2025——细说Java锁的30年进化史
java·后端·性能优化