Chrome下HTTP Ajax POST遇ERR_CONNECTION_RESET的排查与解决求助
问题分析与解决方案
一、问题根源初步判断
从你提供的IIS日志和现象来看,问题核心大概率是HTTP长连接(Keep-Alive)超时+IIS强制关闭连接导致的:
- IIS默认的连接超时时间是120秒(2分钟),你的首次POST请求耗时
118278ms(接近2分钟),刚好触发了IIS的连接超时机制,服务器端强制关闭了socket连接,返回Win32错误码64(指定网络名称不可用)。 - Chrome首次请求复用了之前建立的Keep-Alive长连接,当服务器强制关闭这个连接时,Chrome就抛出
ERR_CONNECTION_RESET错误;而重试时Chrome新建了一个全新的socket连接,此时接口处理耗时19秒(未超过超时时间),所以请求成功。 - Edge浏览器无此问题,是因为它的Keep-Alive连接管理策略和Chrome不同——可能Edge会自动检测空闲超时的连接并丢弃,自动新建连接发起请求,避免了复用失效连接的情况。
二、进一步排查方向
检查IIS连接超时配置
打开IIS管理器,找到你的站点→右键“管理网站”→“高级设置”,查看“连接超时”的数值(默认120秒)。如果你的接口处理确实需要超过2分钟,需要适当调大这个值,同时也要检查服务器的应用程序池超时设置,避免应用池被回收。优化接口处理性能
首次请求耗时近2分钟,第二次仅19秒,说明接口存在性能问题或缓存机制:- 排查是否有慢SQL、未优化的数据库查询;
- 检查是否存在资源锁、并发竞争导致的处理延迟;
- 确认是否有首次请求加载缓存数据,第二次复用缓存的情况。
验证Chrome连接状态
在Chrome中打开chrome://net-internals/#sockets,可以查看当前的socket连接状态,在首次请求前观察是否有空闲时间过长的连接指向你的服务器,以此确认是否是复用了失效连接。
三、Angular临时解决方案:避免复用旧连接
如果需要先通过前端手段规避问题,可以尝试以下几种方式:
1. 添加随机参数强制新建连接
每次POST请求时,在URL后追加一个时间戳参数,让Chrome认为是新的请求路径,从而新建连接:
import { HttpClient } from '@angular/common/http'; // ... const timestamp = new Date().getTime(); this.http.post(`/api/asset/summary/save?t=${timestamp}`, payload) .subscribe(response => { // 处理响应 }, error => { // 错误处理 });
2. 禁用Keep-Alive连接
通过请求头设置Connection: close,让服务器在请求完成后关闭连接,下次请求会自动新建:
import { HttpClient, HttpHeaders } from '@angular/common/http'; // ... const customHeaders = new HttpHeaders({ 'Connection': 'close' }); this.http.post('/api/asset/summary/save', payload, { headers: customHeaders }) .subscribe(...);
⚠️ 注意:禁用Keep-Alive会增加每次请求的连接建立开销,建议仅作为临时方案,优先从服务器端优化根本问题。
3. 提前发送预热请求
在正式POST前,先发送一个简单的OPTIONS/HEAD请求,触发Chrome新建连接,之后再发起POST:
import { HttpClient } from '@angular/common/http'; // ... // 先发送预热请求 this.http.options('/api/asset/summary/save').subscribe(() => { // 预热完成后发起正式POST this.http.post('/api/asset/summary/save', payload).subscribe(...); });
内容的提问来源于stack exchange,提问作者Max_dev
相关产品推荐
相关产品推荐

