如何使用长轮询机制处理SignalR应用程序,以使用Jmeter

时间:2018-09-11 12:54:29

标签: jmeter signalr connect correlation long-polling

我们需要在少数几个传输模式为长轮询的组件中使用SignalR对Web应用程序进行负载测试。我的脚本在连接步骤中挂起。连接步骤为GET- /signalr/connect?transport=foreverFrame&clientProtocol=1.5&connectionToken=ZW6cj17pImmCjGGBQSQNy%2Bdiy7DKDUy4i4R1AE78c%2FTitzS6QgiPoX6fM3zBOrDK11hyx0QNEc92JM6bsLY19MCt5JjaYFgdTDVsbxfnRbkqKp6dpsl64BV1zI8Vu1X%2F&connectionData=%5B%7B%22name%22%3A%22mypreviewhub%22%7D%5D&tid=10&frameId=1

我已经关联了以下2个参数-1)从协商步骤中捕获的连接令牌并在后续请求中使用 2)使用${__time()}作为时间戳,如链接-How to capture signalR connection string in Jmeter

除了这些,我还可以看到在连接steptid和frameid中还有2个参数正在发送。尽管除了连接步骤外其他地方都没有使用这两个参数,我们还需要同时关联这两个参数吗?

或者我的脚本缺少什么?

在各种文章中,我都看到了使用websocket采样器插件的建议,但我相信,如果您的SignalR使用websocket机制,而不是长时间轮询,这可能会有所帮助。

请帮助我解决此问题。感谢您的帮助。谢谢

2 个答案:

答案 0 :(得分:0)

根据How does long-polling work?的答案:

  

<div style='width: 110px; border: solid 1px #f0f0f0' class='my-text'> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam voluptua </div> <b>You can change the "width" and see the result.</b>:接收到请求(轮询)后,服务器没有可供客户端使用的任何信息。

     

Case服务器不发送空响应,而是保持请求打开并等待响应信息可用。完成后,服务器会立即向客户端发送HTTP / S响应,从而完成打开的HTTP / S请求。

因此,您的“挂起”可能表示服务器没有数据。

您可能想查看5 Ways to Load Test Popular Chat Plugins with JMeter的文章,该文章假定使用Parallel Controller来实现长轮询场景测试,甚至有example test plan

无论如何,您的测试都需要复制真实浏览器的功能,因此我建议使用Wireshark之类的嗅探工具捕获JMeter和真实浏览器发送的请求,如果有差异,请修正JMeter配置,因此请求将与真实浏览器发出的请求100%匹配

答案 1 :(得分:0)

此解决方案适用于LoadRunner用户。 1.tid不需要参数,也不必参数frame ID。 TID从1到11随机生成Java脚本

  1. 您的时间戳是12位随机数

  2. 挂起的原因是,永久帧是Signalr的异步功能,您必须使用此语句来注册PUSH。如果“推”不起作用,则进行“轮询”。像这样

web_reg_async_attributes("ID=Push_0", "Pattern=Push", "URL=https://YOURurl.COM/signalr/connect?transport=foreverFrame&clientProtocol=1.5&connectionToken={CONNECTIONTOKEN}&connectionData=%5B%7B%22name%22%3A%22interactionhub%22%7D%5Dtid={TID}&frameId=1", "RequestCB=Push_0_RequestCB", "ResponseHeadersCB=Push_0_ResponseHeadersCB", "ResponseBodyBufferCB=Push_0_ResponseBodyBufferCB", "ResponseCB=Push_0_ResponseCB", LAST);

然后修改您的callback.c函数

int Push_0_ResponseBodyBufferCB( const char * aLastBufferStr, int aLastBufferLen, const char * aAccumulatedStr, int aAccumulatedLen, int aHttpStatusCode) {

//在此处输入ResponseBodyBufferCB()的实现。

lr_vuser_status_message("This is accumulated String %s", aAccumulatedStr);
lr_vuser_status_message("This is response body %s", aLastBufferStr);

下次在录制中启用“使用Asyn”选项时,您将看到此内容,但是您必须在录制结束时关闭浏览器窗口,否则将不会在脚本中发布和创建异步内容!我是用Fiddler发现的。