Jmeter处理ASP.NET应用动态VIEWSTATE计数的关联与请求构造问题
解决方案
1. 单正则提取所有VIEWSTATE
使用JMeter正则表达式提取器即可一次性提取全部动态VIEWSTATE参数,配置如下:
- 参考名称:自定义即可,示例填
VIEWSTATE - 正则表达式:
name="(__VIEWSTATE(\d+)?)" id="[^"]*" value="([^"]+)" - 模板:
$1$$3$ - 匹配数字:
-1(表示提取所有符合规则的结果) - 匹配范围:选择
响应体
提取完成后会自动生成以下变量:
VIEWSTATE_matchNr:本次提取到的VIEWSTATE总数量,随实际返回动态变化VIEWSTATE_n_g1:第n个VIEWSTATE的参数名,n取值为1到VIEWSTATE_matchNrVIEWSTATE_n_g3:第n个VIEWSTATE对应的值,n取值为1到VIEWSTATE_matchNr
2. 动态构造请求Payload
推荐使用JSR223预处理程序(建议选择Groovy语言)动态拼接参数,放在提交POST请求的HTTP sampler下即可,有两种实现方案:
方案1:动态拼接Body字符串
如果你的请求使用Body Data提交参数,使用以下脚本:
def payloadBuilder = new StringBuilder() // 先添加所有固定非VIEWSTATE参数,需替换为你实际的固定参数,需关联的参数(如__VIEWSTATEGENERATOR、__EVENTVALIDATION)先单独做关联再引用 payloadBuilder.append("__VIEWSTATEGENERATOR=${vars.get("VIEWSTATEGENERATOR")}&") payloadBuilder.append("ctl00%24ctl00%24cphBaseContent%24CPH_Section1%24txtNMSJob=&") payloadBuilder.append("__EVENTARGUMENT=&") // 此处补全你所有其他固定参数,省略的部分按实际请求补充 // 遍历所有提取到的VIEWSTATE,逐个拼接 def vsCount = vars.get("VIEWSTATE_matchNr") as int for (int i = 1; i <= vsCount; i++) { def vsName = vars.get("VIEWSTATE_${i}_g1") def vsValue = URLEncoder.encode(vars.get("VIEWSTATE_${i}_g3"), "UTF-8") payloadBuilder.append("${vsName}=${vsValue}&") } // 拼接剩余固定参数 payloadBuilder.append("__EVENTVALIDATION=${vars.get("EVENTVALIDATION")}&") // 此处补全剩余所有固定参数 // 去除末尾多余的&符号 if (payloadBuilder.charAt(payloadBuilder.length() - 1) == '&') { payloadBuilder.deleteCharAt(payloadBuilder.length() - 1) } // 存储最终payload,HTTP请求的Body Data直接填写`${finalPayload}`即可 vars.put("finalPayload", payloadBuilder.toString())
方案2:动态添加参数到请求参数列表(更推荐)
如果你的请求使用参数页签配置参数,使用该方案无需手动处理URL编码,更稳定:
// 清空原有默认参数 sampler.getArguments().removeAllArguments() // 先添加所有固定非VIEWSTATE参数 sampler.addArgument("__VIEWSTATEGENERATOR", vars.get("VIEWSTATEGENERATOR")) sampler.addArgument("ctl00%24ctl00%24cphBaseContent%24CPH_Section1%24txtNMSJob", "") sampler.addArgument("__EVENTARGUMENT", "") // 补全所有其他固定参数 // 遍历添加所有动态VIEWSTATE def vsCount = vars.get("VIEWSTATE_matchNr") as int for (int i = 1; i <= vsCount; i++) { def vsName = vars.get("VIEWSTATE_${i}_g1") def vsValue = vars.get("VIEWSTATE_${i}_g3") sampler.addArgument(vsName, vsValue) } // 添加剩余固定参数 sampler.addArgument("__EVENTVALIDATION", vars.get("EVENTVALIDATION")) // 补全剩余所有固定参数
内容的提问来源于stack exchange,提问作者Shanthan Garlapati
相关产品推荐
相关产品推荐

