You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:45:02