编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

IIS 400 错误:Bad Request - Invalid URL HTTP Error 400. The request URL is invalid.

具体报错如下:

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,那么貌似无解!

未经允许不得转载: 技术文章 » .NET编程 » IIS 400 错误:Bad Request - Invalid URL HTTP Error 400. The request URL is invalid.