如何录制Blazor/SignalR的WSS调用以开展性能/负载测试?
Blazor/SignalR 负载测试实现方案(含JMeter、LoadRunner)
核心实现思路
Blazor/SignalR的负载测试需要分三个核心阶段处理,每个阶段的依赖关系必须严格遵循:
- 登录阶段:通过HTTPS请求完成身份认证,获取后续连接所需的身份凭证(Cookie、认证Token)
- SignalR协商阶段:发送HTTP GET请求到
/negotiate端点,获取connectionId等连接参数,这是建立WSS连接的前置步骤 - WSS连接与二进制交互:基于协商参数建立WebSocket Secure(WSS)连接,使用指定的二进制编码(如MessagePack)完成消息的收发
关键注意点:
- SignalR的WSS连接需要携带登录阶段的身份凭证,否则会被拒绝
- 二进制消息必须严格匹配目标系统的编码规则,序列化/反序列化逻辑要和Blazor客户端保持一致
JMeter 具体实现步骤
1. 录制并提取关键参数
- 启用JMeter的HTTP(S) Test Script Recorder,录制登录流程及后续的
/negotiate请求 - 使用JSON提取器从协商响应中提取
connectionId、accessToken(如果存在);用正则表达式提取器提取登录后的身份Cookie(如.AspNetCore.Identity.Application)
2. 建立WSS连接
- 添加WebSocket Sampler,设置连接模式为
Connect,URL格式为:wss://你的域名/Hub路径?id=${connectionId} - 在Sampler的请求头中添加Cookie和Token参数,确保身份验证通过
3. 二进制消息交互
- 若使用MessagePack编码,添加JSR223 PreProcessor(选择Groovy脚本),将测试数据序列化为二进制字节数组:
import org.msgpack.core.MessagePack; import org.msgpack.core.MessageBufferPacker; def data = ["action": "YourMethod", "args": [123, "test"]] MessageBufferPacker packer = MessagePack.newDefaultBufferPacker() packer.packMapHeader(data.size()) data.each { k, v -> packer.packString(k) if (v instanceof Integer) packer.packInt(v) else if (v instanceof String) packer.packString(v) } packer.close() byte[] binaryData = packer.toByteArray() vars.putObject("binaryMessage", binaryData) - 在WebSocket Sampler中选择
Binary Send模式,将${binaryMessage}作为发送内容 - 用JSR223 PostProcessor反序列化接收的二进制消息,验证业务逻辑正确性
4. 动态脚本优化
- 使用CSV Data Set Config实现多用户登录账号的参数化
- 配置WebSocket连接的超时时间,避免高负载下连接异常断开
- 添加响应断言,确保每个请求/消息交互的结果符合预期
LoadRunner 具体实现步骤
1. 录制基础流程
- 选择Web(Http/HTML)协议,启用录制选项中的WebSocket支持,录制登录和
/negotiate请求 - 录制完成后,手动整理脚本,提取登录Cookie和协商返回的
connectionId,存入参数变量
2. 编写WSS连接代码
- 使用
web_socket_connect函数建立WSS连接,携带身份凭证:web_socket_connect("URL=wss://你的域名/Hub路径?id={connectionId}", "HEADER=Cookie: .AspNetCore.Identity.Application=${cookie_value}", LAST); - 发送SignalR握手消息(若为二进制协议,需对应序列化):
char handshake_msg[] = "{\"protocol\":\"messagepack\",\"version\":1}"; web_socket_send("DATA=" handshake_msg, LAST);
3. 二进制消息处理
- 引入MessagePack的C语言库,实现测试数据的二进制序列化函数
- 使用
web_socket_send_binary发送二进制数据,用web_socket_recv_binary接收并验证:unsigned char binary_data[1024]; int data_len = serialize_your_data(binary_data, sizeof(binary_data)); web_socket_send_binary("DATA_LEN=" + data_len, "DATA=" + binary_data, LAST); unsigned char recv_buffer[1024]; int recv_len = web_socket_recv_binary("BUFFER=" + recv_buffer, "BUFFER_LEN=" + sizeof(recv_buffer), LAST); // 反序列化recv_buffer并验证结果
4. 动态脚本优化
- 使用LoadRunner的参数化工具实现多用户账号的动态替换
- 添加事务标记,统计登录、连接建立、消息交互各阶段的性能指标
- 配置并发用户数和负载模型,模拟真实业务场景的流量压力
内容的提问来源于stack exchange,提问作者Tahil mirza
相关产品推荐
相关产品推荐

