开发HTML-Javascript-C#-DotNetNuke应用时大量元素传参触发404错误
遇到这种“少量数据正常,大量数据就404”的情况,大概率是请求参数的传输方式或服务器/框架的限制导致的,下面是几个最可能的原因和解决思路:
URL长度触发限制:如果你的
fnInput是通过GET请求把参数拼在URL里传给C#的myFunc,那问题基本出在这。Chrome虽然支持较长的URL,但IIS(DotNetNuke依赖的服务器)默认的最大URL长度是4096字符,查询字符串最大长度也是2048字符。350个类似"1234"的元素用逗号分隔后,字符串长度肯定远超这个阈值,服务器会直接拒绝这个请求并返回404。DotNetNuke的请求过滤拦截:DNN自带安全过滤机制,会对过长的请求URL或异常请求进行拦截,防止恶意攻击。你可以登录DNN后台,进入
Settings > Security > Request Filtering,检查是否有针对URL长度、查询字符串长度的限制配置,要是数值太小,就调整到能容纳你350个元素的长度。IIS的请求参数限制:除了DNN的配置,IIS本身也有全局的请求限制。打开IIS管理器,找到你的站点,进入
Request Filtering功能,切换到URL和Query String标签页,查看当前的最大长度设置。如果默认值不够,就修改成合适的数值(比如先估算350个元素的总长度,再留一些冗余)。请求方式选得不对:GET请求天生不适合传递大量数据,换成POST请求就从根源上解决了URL长度的问题。你需要修改前端的
fnInput函数,把GET请求改成POST,把参数放在请求体里;同时调整C#端的myFunc对应的接口,让它接收POST过来的参数(比如用[HttpPost]特性标记,配合模型绑定或者直接读取请求体)。
快速排查步骤
- 打开Chrome开发者工具(按F12),切换到Network标签,触发那个传350个元素的请求;
- 查看请求的类型(GET/POST)和URL长度,确认是不是GET导致的超长URL;
- 如果是GET,直接改成POST;如果是POST,再检查DNN和IIS的请求体大小限制。
内容的提问来源于stack exchange,提问作者Pippo J. David

