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.商用硬件现状 现在硬件的 ...
随机推荐
- SpringMVC 数据交互
为什么使用JSON进行数据交互? JSON数据格式比较简单.解析比较方便,在接口调用及HTML页面Ajax调用时较常用. JSON交互方式 请求是Key/Value,响应是JSON(推荐使用) 请求是 ...
- 综合5项百度大脑AI技术,快速构建智能交通方案
一.整体方案:思路:整合百度AI功能,通过百度AI解决.优化在公交运行过程中遇到的运营.管理.安全等方面的问题.具体如下: 安全方面:通过驾驶员检测+语音合成,对驾驶员状态进行实时检测,跟踪,告警. ...
- Docker浅析
1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像: 运行中的这 ...
- python--推倒式(列表、字典、集合)
python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...
- Yii2中多表关联查询
准备条件: 1.首先准备两张表: customer(用户表)(id, name) order(订单表)(id, customer_id, price) customer 表和 order 表之间是一对 ...
- js 对象 / json / jsonb / jsonp 区别
一.JSON vs JS 对象 1.区别 区别 Javascript 对象 Json 含义 对象的实例 一种数据格式(序列化格式) 传输 不能传输 可以跨平台传输,轻量级 格式 1.键不加引号.加单引 ...
- Mass Assignment:Request Parameters Bound into Persisted Objects 质量分配:请求绑定到持久对象中的参数
- Flipcart 爬取流程
第一步:爬取分类url from requests_html import HTMLSession session =HTMLSession() #https://www.flipkart.com/l ...
- How to: Implement a Custom Base Persistent Class 如何:实现自定义持久化基类
XAF ships with the Business Class Library that contains a number of persistent classes ready for use ...
- JS---DOM---为元素绑定事件的引入,为元素绑定多个代码,兼容代码
1. 为元素绑定事件的引入: 用src直接绑定多个,只实现最后一个(programmer2.js) <input type="button" value="按钮&q ...