关于处理HTTP Get请求ULR过长导致报400错误码的问题

发布时间 2023-07-29 11:13:22作者: 西米阿耶

运行环境:

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请求方式的长度限制到底是多少?

这结果远比我认知的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