C#中HttpWebQuest发起HTTP请求,如何设置才能达到最大并发和性能
在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
的异步方法,如BeginGetResponse
和EndGetResponse
或者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上,可能需要调整注册表中的MaxUserPort
和TcpTimedWaitDelay
值来增加可用的端口数量和减少端口释放前的等待时间。
在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
,请按照以下步骤:
打开注册表编辑器(
regedit
)。这可以通过在开始菜单中搜索“regedit”或者按Win + R
键打开运行窗口,然后输入regedit
并回车来完成。导航到以下路径:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
查找
TcpTimedWaitDelay
键值。如果它不存在,你需要创建它:- 右键点击
Parameters
目录,选择新建
->DWORD (32位) 值
。 - 将新创建的键值命名为
TcpTimedWaitDelay
。
- 右键点击
双击
TcpTimedWaitDelay
键值,然后在“数值数据”框中输入你希望设置的秒数(请确保你选择了十进制而不是十六进制)。点击“确定”保存更改。
关闭注册表编辑器。
为了使更改生效,你需要重启你的计算机。
在调整 TcpTimedWaitDelay
之前,请确保你了解更改的影响,并且在生产环境中进行更改前在测试环境中进行了充分测试。不恰当的设置可能会导致不预期的行为,例如潜在的网络问题或性能下降。
7. 服务器设置
客户端性能的提升也依赖于服务器端的配置。确保服务器能够处理高并发连接和请求。
8. 性能测试
使用压力测试工具(如JMeter或LoadRunner)对你的应用程序进行压力测试,以确定最佳的并发设置。通过测试可以发现性能瓶颈,并据此调整设置。
注意事项
- 设置
ServicePointManager.DefaultConnectionLimit
过高可能会导致服务器压力增大,甚至拒绝服务,应根据实际情况谨慎设置。 - 在高并发场景中,
HttpClient
通常是比HttpWebRequest
更好的选择。 - 使用异步编程模式时,确保理解
async
和await
关键字,避免常见的陷阱,如死锁。
C#中HttpWebQuest发起HTTP请求,如何设置才能达到最大并发和性能的更多相关文章
- ThinkPHP 5 中AJAX跨域请求头设置方法
最近用thinkphp做项目,在测试环境时,存在接口的测试问题.在tp官网也没能找到相关的解决方法.自已看了一下源码,有如下的解决方案. 在项目目录下面,创建common/behavior/CronR ...
- openresty开发系列29--openresty中发起http请求
openresty开发系列29--openresty中发起http请求 有些场景是需要nginx在进行请求转发 用户浏览器请求url访问到nginx服务器,但此请求业务需要再次请求其他业务:如用户请求 ...
- iOS swift HandyJSON组合Alamofire发起网络请求并转换成模型
在swift开发中,发起网络请求大部分开发者应该都是使用Alamofire发起的网络请求,至于请求完成后JSON解析这一块有很多解决方案,我们今天这里使用HandyJSON来解析请求返回的数据并转化成 ...
- AJAX请求 $.ajaxSetup方法的使用:设置AJAX请求的默认参数选项,当程序中需要发起多个AJAX请求时,则不用再为每一个请求配置请求的参数
定义和用法ajaxSetup() 方法为将来的 AJAX 请求设置默认值.语法$.ajaxSetup({name:value, name:value, ... }) 该参数为带有一个或多个名称/值对的 ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
- java中两种发起POST请求,并接收返回的响应内容的方式 (转)
http://xyz168000.blog.163.com/blog/static/21032308201162293625569/ 2.利用java自带的java.net.*包下提供的工具类 代码如 ...
- 【SQL】在数据库中发起http请求的小改进
市面上常见的是用MSXML2.ServerXMLHTTP这个类,但这个类在发起异步请求时并不可靠,就是当send后并不一定会发出这个请求.这里推荐改用Microsoft.XMLHTTP,如果只是简单的 ...
- Web Api 中Get 和 Post 请求的多种情况分析
转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...
- 关于java发起http请求
我们到底能走多远系列(41) 扯淡: 好久没总结点东西了,技术上没什么总结,感觉做事空牢牢的.最近也比较疲惫. 分享些东西,造福全人类~ 主题: 1,java模拟发起一个http请求 使用HttpUR ...
- [Java] 两种发起POST请求方法,并接收返回的响应内容的处理方式
1.利用apache提供的commons-httpclient-3.0.jar包 代码如下: /** * 利用HttpClient发起POST请求,并接收返回的响应内容 * * @param url ...
随机推荐
- [django]数据的导入和导出
除了使用mysqldump或者MySQL客户端进行数据导出,django也提供了类似的功能. 导出 # 导出整个数据库并保存为json文件 python manage.py dumpdata > ...
- CentOS7升级python3到最新版
前言 最近在学习sanic,需要python3.7以上的版本,而centos7默认的python版本是3.6.8,所以升级了一下版本,在此笔录. 步骤 首先,从python官网下载最新版的python ...
- html5 2.0学习
列表定义:是一种特别的对象集合.集合:集中在一起合二为一(聚集). 聚集:多个列(信息资源)排在一起.信息资源:一堆数据,可能是字符,可能是图片. 列表分类:有序列表 无序列表 (自)定义列表 有 ...
- 知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装 知识图谱(Knowledge Graph)- Neo4j 5.10.0 CentOS 安装 https:// ...
- iOS日志获取
IOS日志获取 崩溃日志存放目录: /var/mobile/Library/Logs/CrashReporter
- 现代 CSS 解决方案:原生嵌套(Nesting)
很早之前,就写过一篇与原生嵌套相关的文章 -- CSS 即将支持嵌套,SASS/LESS 等预处理器已无用武之地?,彼时 CSS 原生嵌套还处于工作草案 Working Draft (WD) 阶段,而 ...
- math 库中常用的数学运算和常量【GO 基础】
〇.关于 math GO 语言的 math 库是一个内置的标准库,其中包含了许多数学函数和常量,用于计算各种数学运算和统计学计算. 日常开发中,计算当然是少不了的,那么今天来梳理下备查. 一.测试示例 ...
- 在Go中如何实现并发
Go语言的并发机制是其强大和流行的一个关键特性之一.Go使用协程(goroutines)和通道(channels)来实现并发编程,这使得编写高效且可维护的并发代码变得相对容易.下面是Go的并发机制的详 ...
- Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)
文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...
- Linux常用命令大全 Linux Commands Line - v1.0
The most complete and updated list of commands on linux by LinuxGuide.it - over 350 commands! ...