首页 > 编程语言 >C# 中HttpWebRequest发起HTTP请求,如何设置才能达到最大并发和性能

C# 中HttpWebRequest发起HTTP请求,如何设置才能达到最大并发和性能

时间:2025-01-02 13:58:06浏览次数:6  
标签:HTTP C# 注册表 端口 MaxUserPort 并发 设置 HttpWebRequest TcpTimedWaitDelay

前言

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

1、ServicePointManager设置

ServicePointManager 类是一个静态类,它提供了用于管理HTTP连接的属性和方法。为了提升并发性能,你需要调整以下几个关键属性:

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

ServicePointManager.DefaultConnectionLimit = 100; // 一个合适的值,例如100

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

ServicePointManager.Expect100Continue = false;

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

ServicePointManager.ReusePort = true;

2、异步编程模型

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

3、资源利用和释放

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

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { 
    // 处理响应 
}

4、并行处理

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

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

5、使用HttpClient

如果可能,考虑使用HttpClient类来代替HttpWebRequest

HttpClient是一个更现代的HTTP客户端,它提供了更简洁的API,更好的异步支持,并且默认就配置了更高的并发连接限制。

using (var client = new HttpClient()) { // 发送请求 }

6、系统级配置

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

在Windows操作系统中,MaxUserPort 是一个注册表项,用于确定可用的最大用户端口号。默认情况下,MaxUserPort 的值通常设置为 5000,这意味着TCP/IP协议栈会使用1024到5000之间的端口号用于用户的TCP/UDP连接。

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

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

在修改 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、导航到以下路径:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

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关键字,避免常见的陷阱,如死锁。

 

 

标签:HTTP,C#,注册表,端口,MaxUserPort,并发,设置,HttpWebRequest,TcpTimedWaitDelay
From: https://www.cnblogs.com/DoNetCShap/p/18647477

相关文章

  • 学习笔记:C#高级进阶语法——反射
    二、反射(Reflection)1、反射:就是一个微软提供的帮助类库,可以解析并使用元数据。2、exe/dll----ILSpy工具打开会包含matedata(元数据),描述了当前程序集中有哪些元素成员3、反射动态加载dll文件,调用方法{//1、引用,2、new,3、调方法IDBHelperhelper=newSqlServerHel......
  • 理解 QOverload<T>::of(&ClassName::MethodName);
    这段代码的语法是Qt信号与槽机制的现代实现方式之一,结合了C++11的lambda和模板特性。这里的QOverload是一个Qt提供的工具,用于解决Qt的信号和槽机制在多重重载函数时可能发生的歧义问题。以下是分解此代码的详解:1.connect的语法connect(sender,signal,re......
  • 【prometheus】【blackbox_exporter】grafna导入blackbox_exporter看板配置
    1、进入到grafana看板,选择合适的看板模版地址:https://grafana.com/grafana/dashboards/在搜索框中输入blackbox_exporter,找到合适的模版,如下图所示:2、点击并下载对应看板JSON数据3、在grafana的页面进行导入操作3.1点击importer按钮在左侧的Dashboards按钮,然后点......
  • 大二Web课程设计——张家界旅游网站设计与实现(HTML+CSS+JavaScript) (2)
    ......
  • 详解AQS五:深入理解共享锁CountDownLatch
    CountDownLatch是一个常用的共享锁,其功能相当于一个多线程环境下的倒数门闩。CountDownLatch可以指定一个计数值,在并发环境下由线程进行减一操作,当计数值变为0之后,被await方法阻塞的线程将会唤醒。通过CountDownLatch可以实现线程间的计数同步。为什么说CountDownLatch是一种共享......
  • celery+flask+数据库一个队列执行多个任务出现死锁
    celery创建一个共享队列rpa,该队列下有一个轮循任务和执行任务轮循任务会读取redis队列,循环队列并根据任务情况执行任务轮循间隔为1s,每次轮循都会循环队列的所有任务启动命令为celery-Aapp.celeryworker-Pgevent-c1--loglevelINFO-Qrpa此时设置并发数为1时,用......
  • 学习笔记:C#高级进阶语法——泛型
    一、Generic(泛型)1、泛型的定义:通用的类型就是泛型//在一个方法,传入的参数不确定的时候,我们可能要重写多次这个方法publicvoidShow(stringt){Console.WriteLine($"Thisis{typeof(CommonMethod).Name},parameter={t.GetType().Name},type={t}");}publicvoidShow(i......
  • opencv的亚像素角点检测函数cornerSubPix
    在OpenCV中,cornerSubPix函数用于对角点的亚像素精确化。这个函数可以提高角点检测的精度,通常在角点检测之后使用,如在Harris或Shi-Tomasi角点检测之后。函数原型voidcv::cornerSubPix(InputArrayimage,InputOutputArraycorners,SizewinSize,Size......
  • Conda基本使用
    Conda是跨平台的可用于在Windows、macOS和Linux上管理python环境和包的工具;方便在不同项目中创建隔离的python环境,解决python版本或包依赖带来的问题。环境管理Conda版本conda--version更新Conda到最新版本condaupdateconda查看主机存在的cuda环境condaenv......
  • 统信UOS报错qt.qpa.plugin:Could not load the Qt platform plugin "xcb" in “***”
    问题截图: 解决方案:执行命令sudoln-fs/usr/lib/x86_64-linux-gnu/libxcb-util.so.0/usr/lib/x86_64-linux-gnu/libxcb-util.so.1 参考链接:Ubuntu22.04中解决CouldnotloadtheQtplatformplugin“xcb“问题解决方法_couldnotloadtheqtplatformplugin"xcb......