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

使用AJAX GET传递Model至控制器GET方法时遇查询字符串过长错误

解决GET请求传递大Model时的查询字符串过长问题

嘿,这个问题我太熟了!你遇到的The request filtering module is configured to deny a request where the query string is too long.错误,本质是GET请求的特性导致的——GET会把所有请求数据拼接到URL的查询字符串里,而IIS默认对查询字符串的长度有严格限制(默认约2048字符),一旦你的Model序列化后超过这个长度,就会触发拦截。

下面给你几个可行的解决方案,按推荐程度排序:

1. 改用POST请求(最推荐)

POST请求是把数据放在请求体里,没有GET那种URL长度限制,同时也更安全(数据不会暴露在URL里)。只需要修改前端和控制器的代码:

前端代码调整

<div id="match-object" data-model="@Json.Encode(@Model)"></div>
<script>
// 记得把序列化的字符串解析成JSON对象,不然会以字符串形式传递
var model = JSON.parse($("#match-object").attr("data-model"));
$.post("myUrl", model, function(result) {
 $('#result-div').append(result);
});
</script>

控制器代码调整

给对应的Action加上[HttpPost]属性,确保它能接收POST请求:

[HttpPost]
public ActionResult MyUrl(YourModelType model)
{
    // 你的业务逻辑处理
    return PartialView(result);
}

2. 优化Model,只传递必要字段

如果你的Model包含很多控制器不需要的属性,完全没必要全传。可以创建一个DTO(数据传输对象),只保留控制器需要的字段,这样序列化后的字符串长度会大幅减少:

定义DTO

public class YourModelDto
{
    public int Id { get; set; }
    public string KeyField { get; set; }
    // 只保留控制器实际需要的属性
}

视图中序列化DTO

<div id="match-object" data-model="@Json.Encode(new YourModelDto { 
    Id = Model.Id, 
    KeyField = Model.KeyField 
})"></div>

这样调整后,查询字符串长度会大大缩短,大概率能避开IIS的限制,同时也让数据传输更高效。

3. 调整IIS请求筛选设置(不推荐,仅作为应急方案)

如果以上两种方法都不适用,可以临时调整IIS的查询字符串长度限制,但要注意这会降低安全性——更长的查询字符串可能被利用进行攻击,而且不同浏览器对URL长度也有各自的限制(比如Chrome约8KB),治标不治本。

修改项目根目录下的web.config,添加或修改requestLimits配置:

<system.webServer>
  <security>
    <requestFiltering>
      <!-- 这里设置你需要的最大长度,比如10240字节(10KB) -->
      <requestLimits maxQueryString="10240" />
    </requestFiltering>
  </security>
</system.webServer>

内容的提问来源于stack exchange,提问作者BMills

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:31:05