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

如何录制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:35:18