运行环境:
Win11,VS 2022
现象:使用swagger,Postman 发起一个GET请求,返回:HTTP Error 400. The request URL is invalid. 另外 Response Headers 中显示 Server:Microsoft-HttpApi / 2.0
原因:是由于Get请求的URL字符串长度过长,导致 HTTP.sys服务拦截并终止。
解决方案:
在注册表项:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters 下面新增 UrlSegmentMaxLength参数 值设置为512(不一定是这个数,根据情况来,也没研究这个最大是多少)
操作步骤:
1.按Win+R键,打开运行窗口
2.输入 regedit ,点击确定 打开注册表编辑器
3.在注册表编辑器里面找到 "计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters"目录
4.看下右侧有没有“UrlSegmentMaxLength”这个参数,有的话修改以下值,没有的话,右键空白的地方,新建-DWORD(32位)值,名称改为“UrlSegmentMaxLength” 数值数据填写 512 基数选“16进制”
5.以管理员身份运行“命令提示符”,输入 net stop http 命令 ,按Enter键,然后输入net start http 按Enter键 (这个过程可能http service会卡死,我重启电脑了)
注:关于注册表这几个操作的意思,我不懂,但是我这样改了就可以了,大家酌情参考!
参考信息:
下面是我的处理过程,不重要……
正在学习一个开源项目AdminNet, 在跑源代码的时候,发现一个接口报400错误码,看图!
身为一个资深CV码农,当然看见这个URL就觉得挺离谱的,毕竟老师当时说过,Get请求有长度限制!,于是乎我打开百度 Bing,搜索了一下关于Get请求长度限制相关的信息,大概结果是这样的:
这结果远比我认知的GET牛逼啊,能传这么多字符呢? 我看了我的URL,绝对没有超过这个长度…没办法了,去技术群里面找大佬吧……
于是就把图1,发到技术群里面。果然,先来的是鄙视……什么token放url里面了,难道不知道url传不了这么多数据吗…巴拉巴拉… (这他妈的也是我不愿意去技术群提问题的原因)
后来有个老伙计,发了一张图,说他那边没问题……看图:
这起码证明了以下几个事情:
1.接口没问题!
2.URL确实可以这么长!
3.我本地环境有问题!
所以,换个电脑吧……于是把代码放到另一台电脑上跑了一下,结果看图:
竟然可以跑通……但这时候依然比较懵,为啥嘞?完全没有思路…咋整,再问问呗。于是去另一个技术群里面请教大佬!
注意!重点来了,大佬提到了web服务器。。。我好像在看swagger请求返回数据的头信息(Response headers)里面看到了一个Server!!!(可以翻翻上面的图片)
于是仔细对比出错的和正常的两个返回信息,发现报400错误的返回结果里面 server:Microsoft-HttpApi / 2.0 ,而请求正常的电脑上面server:Kestrel(这里有一定的运气成分,因为另一台电脑是mac,所以默认跑代码的时候用的是Kestrel)
接下来就看了下我的vs,发现确实是用IIS Express 跑的,换成 Kestrel就好了!(这里就不贴图了,毕竟正确的页面千篇一律,错误的方式千奇百怪……)
理论上到这里就结束了,但是作为一个资深CV码农,请注意!是资深!!!显然不能满足于此! 我要让他再iis 上面也能跑!
于是继续Bing……IIS配置url请求长度限制
搜索的结果,概括一下大致分为以下两种处理方式
1.修改webconfig文件
<configuration> <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" maxQueryString="40800" maxUrl="40800" /> </requestFiltering> </security> </system.webServer> <system.web> <httpRuntime maxRequestLength="999999999" maxQueryStringLength="2097151" /> </system.web> </configuration>
2.修改IIS服务器配置
步骤:
1.打开IIS管理器
2.点击左侧网站(或者最顶级服务器名称)
3.找到中间功能页面的“请求筛选”功能,双击进入
4.在最右侧找到操作栏目,点击“编辑功能设置”
5.在弹出的页面中,修改请求限制的各项参数(允许最大的内容长度,最大URL长度,最大查询字符串)
6.确定,重启IIS服务。
然而,依照上面的方式配置完成以后,依然400!!!(这里不排除有些同学的电脑,到这一步设置以后就可以了,但是我的电脑……不行)
这可咋整???此时我的状态……
突然,脑子灵光一闪!!!我出错的时候不是用的IIS Express吗?为什么前端显示我的Server是Microsoft-HttpApi / 2.0 ????这Microsoft-HttpApi / 2.0 是个什么东西???
然后继续Bing一下……Microsoft-HttpApi / 2.0 400 ,嘿!巧了,还真有命中的……
IIS的GET请求返回Microsoft-HttpApi / 2.0 | 码农家园 (codenong.com)
按照这篇文章的说法,是前端发发送的请求因为不符合规则(什么规则,我怎么不知道?规则不是我定的么……)被Http.sys给拦截了,于是改了一下注册表(修改方法在文章顶部)! 终于我的IIS也能接收这么长的Url了,而且返回的头信息里面 Server 也变成了Microsoft-IIS/10.0(为什么变得 ,我也不知道……)
至此问题处理完成!
另外补充一个官方文档(这个我没有尝试,有兴趣的朋友可以试一试):
HTTP 400 对 HTTP 请求的错误响应 - Internet Information Services | Microsoft Learn