JMeter测试SignalR是否必须使用WebSocket Sampler?
报错根因
你遇到的java.net.SocketTimeoutException报错核心原因是:SignalR的signalr/connect请求在默认WebSocket传输模式下属于HTTP协议升级请求,握手完成后连接会转为WebSocket长连接,不会返回普通HTTP请求的结束标识,JMeter自带的HTTP Sampler只会等待完整的HTTP响应结束,自然会触发超时。你之前的signalr/start请求能正常执行,是因为该请求本身是短HTTP请求,返回响应后连接就会关闭,符合HTTP Sampler的处理逻辑。
关于是否必须使用WebSocket Sampler
不是强制要求,但要匹配服务端的传输配置:
- 如果你的SignalR服务端强制配置为长轮询(LongPolling)或Server-Sent Events传输模式,全程走纯HTTP协议交互,用普通HTTP Sampler即可正常处理所有SignalR请求。但这种方式的测试场景和用户默认使用WebSocket的真实场景不一致,性能测试结果不具备参考性。
- 如果你的服务端使用官方默认配置、优先走WebSocket传输,就必须使用WebSocket采样器处理
connect阶段的握手和后续的帧通信,用普通HTTP Sampler必然会超时。
WebSocket Sampler配置关键要点(解决之前配置失败问题)
- 前置
signalr/negotiate请求必须配置JSON提取器,提取两个核心参数:connectionToken、connectionId,同时确认响应的availableTransports字段中包含WebSocket传输支持。 - 握手请求URL的协议头必须替换:HTTP服务用
ws://开头,HTTPS服务用wss://开头,不要用http/https,URL拼接格式参考:ws://<服务地址>/signalr/connect?transport=webSockets&connectionToken=${提取的connectionToken}&id=${提取的connectionId}&<其他浏览器请求中带的查询参数> - 握手请求的头信息要和浏览器对齐,必须携带登录态的Cookie/Authorization请求头,
Upgrade: websocket、Connection: Upgrade、Sec-WebSocket-Version: 13三个头字段如果采样器没有自动生成需要手动补充。 - 握手成功后必须先发送SignalR协议初始化帧,JSON协议的帧内容为
{"protocol":"json","version":1},注意末尾的ASCII 0x1E分隔符不能省略,缺少该分隔符会导致服务端不识别请求,这是多数人配置失败的核心原因。 - 初始化帧发送成功后再执行
signalr/start请求,严格遵守浏览器端的请求时序。
内容的提问来源于stack exchange,提问作者Beklevir
相关产品推荐
相关产品推荐

