具体报错如下:
Bad Request - Invalid URL HTTP Error 400. The request URL is invalid.
这个问题困扰了我3天,可以知道的是 URL 太长,注意不是参数太长,是 path 太长,我的 URL 大致如下:
ws://www.codingwhy.com/ws/i0PbKXI20eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiIxNzg4NDYzODcwNzMyMzI4OTY0IiwiQWNjb3VudCI6ImFkbWluIiwiVXNlck5hbWUiOiLnrqHnkIblkZgiLCJBZG1pbmlzdHJhdG9yIjoxLCJUZW5hbnRJZCI6ImRlZmF1bHQiLCJPbmxpbmVUaWNrZXQiOm51bGwsImlhdCI6MTcxNjQ0MDczMywibmJmIjoxNzE2NDQwNzMzLCJleHAiOjE3MTY0OTQ3MzMsImlzcyI6Inlpbm1haXNvZnQiLCJhdWQiOiJ5aW5tYWlzb2Z0In0.3rNvJZ4J8_E7wGBdAtHaVoU1r0-s1fbAtgB_i0PbKXI
是的,我用到了 websocket,把 ws 协议换成 http 也是一样的:报400。
首先,我介绍下我的开发环境:.net core 6,我在本地调试的时候是没有任何问题的,部署到 IIS 上之后出现了此问题,具体表现是,我的ws在浏览器的console里面一直报错:WebSocket connection to failed。所以我认为,肯定是IIS配置方面的问题。
参考网上的解决方案,都没有用,具体有以下:
1、官网:排查 IIS 中的 HTTP 400 错误 - Internet Information Services | Microsoft Learn
我在服务器上找到了文中提到的路径:C:\Windows\System32\LogFiles\HTTPERR\httperr.log
文中描述中,提到,在这个文件中会告知 400 的原因,如下图所示:
他这个就是在注册表中添加 FieldLength。因为我的 httperr.log 文件中什么都没提示,所以加了也没用!
2、修改注册表,新增值
运行regedit,进入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters ,
1. 添加类型为 DWORD(32-bit)、名为 MaxFieldLength、值为十进制32768的项目;
2. 添加类型为 DWORD(32-bit)、名为 MaxRequestBytes、值为十进制32768的项目。
还是没用!
3、修改 web.config 文件
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxUrl="409600" maxQueryString="204800" maxAllowedContentLength="2097152" />
</requestFiltering>
<security>
<system.webServer>
<configuration>
<system.web>
<httpRuntime maxRequestLength="999999999" maxQueryStringLength="2097151" />
</system.web>
</configuration>
修改了,还是没用。
4、修改源码,新增如下代码
services.Configure<IISServerOptions>(options =>
{
options.MaxRequestBodySize = 209715200;
});
每经过一次设置,都是重启服务器,因为实在没有耐心输入命令重启了。
期间,我还确定了服务器的 websocket 协议肯定是没有问题的。
最后实在没办法,我在本地启起了 .net core 的项目,把 URL 也弄的很长,发现只是报 404 错误,于是我放弃了把 .net core 部署到 iis 的想法,直接在服务器上启动了 .net core 项目,最终解决了 Bad Request - Invalid URL HTTP Error 400. The request URL is invalid. 的问题
其实解决这个问题的核心是什么?就是只要你输入很长的URL,不报400了就行了,我试了在 nginx 下也是没问题的,所以如果你的应用可以在 nginx 或其他 web容器下部署,可以换换其他web容器,IIS如果经过上面的4个方案,还是报400,那么貌似无解!