HttpWebRquest.GetRequestStreamAsync()发生延迟
前景提要:此问题不定适用Browser通信方式,主要提供给通信发生异常时解决思路。
Q: request请求创建过程发生延迟
【Scene】:
.Net的HttpWebRquest.GetRequestStreamAsync()执行前后偶发延迟(时间尝试2分钟左右),客户端也未捕获通信异常。
【Env】:
Platform: .Net
Http Version: v1.1
【Analyze】:
1)抓包:

Description:通过抓包可以看到一次完整的通信过程:
1)建立三次握手
2)POST通信发送信息
3)响应HTTP 200,获取响应信息
4)四次挥手,关闭连接。
可以看到在第四部客户端和服务端都进行尝试关闭连接的过程中发生了异常,服务端返回的500错误,第二条通信建立第三次握手则就出现了延迟。
A:这是个综合性问题,根本的解决问题,需要客户端和服务端都进行优化和修改。
【Conclusion】:
初步分析,大概由于以下几方面问题影响:
客户端使用的是http1.1存在队头阻塞问题,则会出现下个请求等待上一个异常通信连接关闭后才能正常运行,连接关闭的需要等待的时为2MSL。
服务端由于未对异常通信进行及时关闭和销毁,保持了大量的TIME_WAIT和CLOSE_WATI状态,则导致越繁的出现通信异常。
【Solution】:
客户端:
1)取消使用using(request.GetRequestStreamAsync()),使用
try{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.GetRequestStreamAsync();
request.dispose();
}catch(ex){
//再次对request队形进行终止,预测会关闭异常的连接。
//此种方式因未有环境实际测试,实在抱歉,望有尝试此方案的人给予答复是否可行
request.abort();
request=null;
}
因为using(request.GetRequestStreamAsync())方式等效try{}catch(error){}finally{request.dispose()},若request.disponse()发生异常则无法捕捉错误,这也就是抓包中看到的四次挥手发生异常但未有异常日志记录的原因。
其他提供性能方案:
a. 使用HttpClient 和指定HTTP 2.0,因为HTTP 2.0可以多路复用可以减少此种方式
b. 设置ServicePointManager.DefaultConnectionLimit = 1024; //此数据并不是最优数值,可根据各自环境进行设置。
c. 关闭proxy代理:https://www.cnblogs.com/TianFang/archive/2011/09/18/2180741.html,可优化首次简历request连接的时间。
服务端:
1)处理TIME_WAIT和CLOSE_WAIT状态:参见:https://www.cnblogs.com/felixzh/p/8351366.html
2)若服务端接收到异常通信时,则需要发送connection:close;来进行主动关闭异常连接
3)设置服务端MSL时间
HttpWebRquest.GetRequestStreamAsync()发生延迟的更多相关文章
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...
- corefx 源码追踪:找到引起 SqlDataReader.ReadAsync 执行延迟的那行代码
最近遇到一个非常诡异的问题,在一个 ASP.NET Core 2.2 项目中,从 SQL Server 数据库查询 100 条数据记录,会出现 16-22s 左右的延迟.延迟出现在执行 SqlData ...
- Singleton(单例模式)的一种实现 -- 基于【惰性】适用于【大对象】的一种生产实践
一.说明 本文中的代码类,在生产中使用了很长的时间,曾应用于多个企业多个项目实践中,其中也踩了不少坑,总结了一些适用的业务情景, 重要的事情说三遍: a.本代码类不是万能药,不要在业务情景中滥用! b ...
- Quartz任务调度基本使用
转自:http://www.cnblogs.com/bingoidea/archive/2009/08/05/1539656.html 上一篇:定时器的实现.Java定时器Timer和Quartz介绍 ...
- LoadRunner测试结果分析03 转载至zhangzhe的新浪博客
LoadRunner测试结果分析之我见 前面分析的Web Resource(网络资源)的测试情况,其主要关注的是服务器性能,而系统本身和环境都有可能存在问题,页面诊断(Web Page Diagnos ...
- MySQL 5.7系列之sys schema(2)
0.导读 MySQL 5.7引入了sys schema,有了它,我们排查分析一些问题时将更得心应手.sys schema里主要存储的是视图.存储过程.函数等. 视图:用于结果的汇总展示及配置持久化: ...
- 解决服务器Active Directory环境里Windows登录性能问题办法
Windows登录性能因素 当查找登录性能问题的原因时,考虑大量因素很重要.一些因素包括: 域控制器太接近用户 网络连接与可用的带宽 数据中心上的硬件资源(x64 vs.x86.内存等) 应用于用户和 ...
- Replication的犄角旮旯(四)--关于事务复制的监控
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- What every programmer should know about memory 笔记
What every programmer should know about memory, Part 1(笔记) 每个程序员都应该了解的内存知识[第一部分] 2.商用硬件现状 现在硬件的 ...
随机推荐
- 【后端C#】后台通过http post 调用 webservice 的方法
定义http post 调用webservice的某个方法 /// <summary> /// http Post调用 WebService /// </summary> pu ...
- 如何快速将多个excel表格的所有sheet合并到一个sheet中
1.将需要合并的excel文件放在同一个文件夹下: 2.新建一个excel表格并打开,右键sheet1,查看代码,然后复制下方的代码到代码框里,点击菜单栏中的“运行”–“运行子过程/用户窗体”,等待程 ...
- Xshell 连接 VirtualBox
VirtualBox设置端口转发 Xshell 新建会话 连接成功
- eclipse 的安装
打开eclipse官网 https://www.eclipse.org/ 点击此处 再点击 最后点击下载 然后一路下一步安装即可 添加中文语言包 打开eclipse官网 https://www.ecl ...
- SpringCloud 脚手架
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...
- OpenResty + ModSecurity + OWASP CRS
本篇将介绍如何使用OpenResty和ModSecurity 来构建自己的WAF,安装过程整体与Nginx是类似的,但也有些区别,在文中会特别指出,本篇算是用openresty对前面两篇nginx和c ...
- .Net Core组件化视图(部分视图)
.Net Core组件化视图(部分视图) 1.背景 1.以前我们使用.Net的时候使用部分视图的方式在,.Net Core 中能在单独处理逻辑的部分视图没有了,但是我们还是想使用现在的.Net Cor ...
- Nexus-在项目中使用Maven私服,Deploy到私服、上传第三方jar包、在项目中使用私服jar包
场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...
- 使用ul和li进行图片的布局
使用ul和li进行浮动布局(自适应) 1 图片上下两排: 首先盒子的宽度要给100% ul包裹一个div,首先量好盒子的宽和高,并进行设置, margin 0 auto 盒子居中显示 每个li向左浮动 ...
- 43.QT-访问远程SQLite数据库
在上章42.QT-QSqlQuery类操作SQLite数据库(创建.查询.删除.修改)详解学习了如何操作SQLite,本章来学习如何访问远程SQLite 1.首先设置共享,映射(用来实现远程访问) 将 ...