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

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_matchNr
  • VIEWSTATE_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:39:02