WebSocket 握手失败,net::ERR_CONNECTION_RESET引发的问题解决方法
最初问题:WebSocket 握手失败,net::ERR_CONNECTION_RESET。


再来看一下IIS请求日志:
2026-03-23 02:53:05 1xx.xxx.xxx.xxx GET /signalr/connect transport=webSockets&clientProtocol=1.5& connectionToken=CatYmwC5Lq8MxtIspjpNc2oZqGRLIU12IEKsnOBPY3pP1EGSxP%2Feyv7dwrveG89u2gnolo8CgQOM9 Aim5xO%2FlzNN6Xq9qsFGkWm2GvMHRrUNxLThuYL5K8YzuNX2kauH&connectionData=%5B%7B%22name%22%3A%22msgserverhub%22%7D%5D& tid=5 8889 - 192.168.8.185 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko - 400 0 0 15
其他IIS日志:
Edge 浏览器尝试了 WebSocket 但失败了,最终降级到 longPolling。
09:06:42 GET /signalr/connect transport=webSockets → 400 失败 09:06:47 GET /signalr/connect transport=foreverFrame → 200 (5303ms) 09:06:47 POST /signalr/connect transport=longPolling → 200
一、先解读这条日志的核心信息
先把日志字段拆明白(IIS 日志默认格式):
| 字段值 | 含义 | 关键信息 |
|---|---|---|
2026-02-27 09:06:42 |
请求时间 | 特定时间点的请求 |
GET /signalr/connect |
请求路径 + 方法 | 客户端尝试通过 SignalR 建立 WebSocket 连接 |
transport=webSockets |
SignalR 传输方式 | 客户端优先选 WebSocket(长连接) |
connectionToken=XXX |
连接令牌 | 标识客户端连接 |
400 0 0 3 |
状态码 + 耗时 | ① 400=请求错误;② 3 = 耗时 3ms(但错误本身是关键) |
👉 核心结论:客户端发起的 SignalR WebSocket 连接请求,返回了 400 错误(请求无效)。
- WebSocket 连接失败:上图中
ws://localhost:7411/signalr/connect?transport=webSockets未返回响应,说明握手阶段被中断。 - 第二张图中:Server-Sent Events (SSE) 连接成功:
transport=serverSentEvents的请求返回200 OK,Content-Type: text/event-stream,说明降级传输方式可用。

问题分析:
结合之前的 net::ERR_CONNECTION_RESET 错误,问题聚焦在 IIS 对 WebSocket 的处理环节:
从截图中的请求路径看,这是基于 SignalR 的 WebSocket 连接(transport=webSockets),常见于一些实时通讯类系统。
遇到的是 WebSocket 握手失败:net::ERR_CONNECTION_RESET,本质是客户端与 WebSocket 服务器之间的连接被强制重置,导致握手无法完成。
ERR_CONNECTION_RESET 是服务器端主动断开或中间设备拦截的典型表现,而非客户端主动取消
二、这个错误对线程 / 性能的影响(为什么会导致线程耗尽?)
SignalR 是ASP.NET中实现实时通信的框架,基于长连接(WebSocket / 轮询),这个 400 错误会引发连锁问题:
1. 连接失败→客户端重试→大量无效请求占线程
- WebSocket 连接失败后,SignalR 客户端会自动降级为「长轮询(Long Polling)」,或反复重试连接;
- 每一次重试都是一次新的 HTTP 请求,会占用线程池线程;
- 如果大量客户端都触发这个 400 错误→重试请求暴增→线程被大量无效请求占满→线程耗尽。
1. SignalR + IIS WebSocket环境配置检查
- ✅ Windows 功能:已勾选 WebSocket 协议,安装完整。
- ✅ IIS 配置:
system.webServer/webSocket全局enabled=True,且已解锁。 - ✅ 应用程序池:目标站点
xxx.web使用 .NET v4.0 + 集成模式,完全兼容。 - ✅ web站点nuget安装的SignalR 版本:前端
jquery.signalR-2.2.1.min.js与后端 .NET 4.0 匹配。 - ✅ 若为 HTTPS 站点,确保 WebSocket 连接使用
wss://协议,避免混合内容拦截
🚩 可能原因与排查方向
1. 网络 / 防火墙层面问题
- 防火墙 / 安全组拦截:服务器端防火墙、云服务商安全组、客户端本地防火墙,可能拦截了 WebSocket 端口(通常是 80/443,或自定义端口)
- 代理 / 反向代理配置错误:Nginx/Apache/IIS 等反向代理未正确配置 WebSocket 支持(缺少
Upgrade/Connection头转发) - 网络中断或路由问题:客户端与服务器之间的网络链路不稳定,导致连接被重置
2. 服务器端配置问题
- WebSocket 功能未启用:IIS/ASP.NET Core 等服务器未开启 WebSocket 支持(如 IIS 需安装 WebSocket 模块,且配置节未锁定)
- SignalR 服务未正常启动:后端 SignalR Hub 未启动、配置错误或进程崩溃
- 请求参数 / 鉴权失败:
connectionData/tid等参数无效,或鉴权 Token 过期,服务器主动拒绝连接
3. 浏览器 / 客户端层面问题
- 浏览器禁用 WebSocket:极少数情况下浏览器或插件会阻止 WebSocket 连接
- 混合内容问题:HTTPS 页面尝试连接 ws:// 协议的 WebSocket,被浏览器安全策略拦截




问题及最终解决方法:
具体windows日志如下:

webconfig增加配置项:
<system.web>
<httpRuntime targetFramework="4.5" ........
连接成功:
2026-03-23 08:30:59 ::1 GET /signalr/connect transport=webSockets&clientProtocol=1.5& connectionToken=F1vPbOsx%2B2C7bWSLSYo0WQU7eDfBBrzQkSrrj1ZcvdfoxX%2FJ2zfX9judlejXUNnwzml UbDbYGQXeznV0NQX1SNr7c60ne%2BQFSxHtts7BhIIr%2FisYkprOB4NesFl1zFsJ&connectionData=%5B%7B%22name%22%3A% 22msgserverhub%22%7D%5D&tid=4 7411 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+ (KHTML,+like+Gecko)+Chrome/145.0.0.0+Safari/537.36 - 101 0 64 1420332
2026-03-23 08:09:53 ::1 GET /signalr/start transport=webSockets&clientProtocol=1.5& connectionToken=XCrtdZpPnhk4y9UPFN1oALO3IHbuyif%2BB7wXE9XRUBmbwyZoU8tK%2Fgn3m0UPlo5FRqhOGDIgt6KdiK8N%2BOG89 dBItLoA4HN7%2Fek3TPh5QmUWGtmTLx9L%2FRu3uCxLHFyy&connectionData=%5B%7B%22name%22%3A% 22msgserverhub%22%7D%5D&_=1774253392595 7411 - ::1 Mozilla/5.0+(MSIE+9.0;+Windows+NT+10.0;+WOW64;+Trident/7.0; +rv:11.0)+like+Gecko http://localhost:7411/OpenBidMain/Index 200 0 0 3



浙公网安备 33010602011771号