【问题标题】:Size of the request headers is too long请求标头的大小太长
【发布时间】:2022-03-24 17:42:30
【问题描述】:

我目前正在开发一个 ASP.NET MVC 网站,它运行良好。

但是我有一个我根本不明白的问题...例如,当我在 Visual Studio 上使用 Chrome 启动我的网站时没问题,但是当我停止它并尝试使用 Firefox 启动其他测试时,我的网址正在增长,然后我收到此错误:

HTTP 400。请求标头的大小太长。

有人能解释一下为什么会这样吗?是我的代码有问题还是来自 IIS express 或其他什么?

提前致谢

【问题讨论】:

标签: asp.net


【解决方案1】:

您可能可以增加您的网络服务器允许的请求大小。但是,请查看您的浏览器发送到服务器的 cookie 的数量和大小。清除您的 cookie 并重试,看看您是否可以减少您的应用程序使用的 cookie 的大小和数量。越少越好!移动浏览器可能会出现这些错误,因为它们不允许与桌面浏览器相同的大小(?)。

该错误也可能意味着查询字符串变得太大。

【讨论】:

    【解决方案2】:

    查看MSDN:

    原因

    当用户是多个 Active 的成员时,可能会出现此问题 目录用户组。当用户是大量的成员时 活动目录对用户的 Kerberos 身份验证令牌进行分组 尺寸增加。用户向 IIS 发送的 HTTP 请求 服务器在 WWW-Authenticate 标头中包含 Kerberos 令牌,并且 标题大小随着组数的增加而增加。如果 HTTP 标头或数据包大小增加超过配置的限制 IIS,IIS 可能会拒绝请求并将此错误作为响应发送。

    分辨率

    要解决此问题,请选择以下选项之一:

    A) 减少用户所属的 Active Directory 组的数量 成员。

    或

    B) 修改 MaxFieldLength 和 MaxRequestBytes 注册表设置 在 IIS 服务器上,因此也不考虑用户的请求标头 长。确定 MaxFieldLength 的适当设置 和 MaxRequestBytes 注册表项,使用以下 计算:

    1. 使用以下文章中描述的公式计算用户的 Kerberos 令牌的大小:

      当用户属于多个组时,Kerberos 身份验证问题的新解决方案 http://support.microsoft.com/kb/327825

    2. 在 IIS 服务器上配置 MaxFieldLength 和 MaxRequestBytes 注册表项,值为 4/3 * T,其中 T 是用户的令牌 大小,以字节为单位。 HTTP 使用 base64 编码对 Kerberos 令牌进行编码 因此将令牌中的每 3 个字节替换为 4 个 base64 编码字节。对注册表所做的更改不会发生 在您重新启动 HTTP 服务之前生效。此外,您可能有 重新启动任何相关的 IIS 服务。

    【讨论】:

    • 这是此错误的一个非常具体的原因和修复方法,即“当用户是多个 Active Directory 用户组的成员时可能会出现此问题”。 OP尚未确认是这种情况。
    • 尽管这是否是 OP 的特定错误实例的问题,但它是我的实例的问题,因此非常有帮助。谢谢。
    • 如果站点托管在 IIS Express 中,这会起作用吗?
    • 以上答案在应用程序使用表单身份验证时适用?
    【解决方案3】:

    试试这个

    <system.web>
            <httpRuntime maxRequestLength="2097151" executionTimeout="2097151" />
    </system.web>
    

    maxRequestLength 默认大小为 4096 KB (4 MB)。

    如果浏览器一次又一次地请求某些资源,有时请求头值长度会增加多次,因此我们可能会尝试将请求长度扩展到最大长度。 我希望这可能有用

    【讨论】:

    • 虽然此代码可能有助于解决问题,但提供有关 why 和/或 如何 回答问题的附加上下文将显着改善其长期价值。请edit你的答案添加一些解释。
    • maxRequestLength 默认值是 4 MB——对于此类错误来说非常大。
    • 如果您需要增加 maxRequestLength,我会说您还有另一个问题。
    • @cederlof 你能在这里详细描述一下吗
    • 我同意 - 这掩盖了问题,而不是找到问题的真正解决方案。向您的服务器允许这些非常大的请求会使您面临其他拒绝服务类型的问题。
    【解决方案4】:

    .NET MVC 解决方案 就我而言,是我的声明将我的会话 cookie 乘以在我的浏览器 cookie 中如下所示:

    .AspNet.ApplicationCookie
    .AspNet.ApplicationCookieC1
    .AspNet.ApplicationCookieC2
    .AspNet.ApplicationCookieC3
    .AspNet.ApplicationCookieC4
    .AspNet.ApplicationCookieC5
    .AspNet.ApplicationCookieC6
    .AspNet.ApplicationCookieC7
    __RequestVerificationToken
    

    我只是去我的 mssql 管理工作室中的 aspNetUserClaims 表并清除它。然后清除该项目的浏览器cookie。

    刷新了页面。卡拉斯!!!完毕!! 我相信它的发生是因为我从一个数据库连接字符串切换到另一个导致claimsManager 重新创建会话并添加到我的cookie。饱和时,一切都爆炸了。

    【讨论】:

      【解决方案5】:

      在我的例子中,我的本地主机上提供了来自许多不同应用程序的 cookie,并带有大型 cookie。 FF 通过主机名进行区分,因此从 localhost 清除我的 cookie 修复了它。

      【讨论】:

        【解决方案6】:

        在 Windows 系统中,通常由于 http.sys 服务中设置的默认标头大小限制而发生此错误。在将请求转发到应用程序之前,此服务充当保护层,以防止应用程序被无效请求淹没。

        您可以通过修改 Windows 注册表来覆盖默认的最大标头限制。

        按照步骤操作:

        • 运行注册表
        • 从地址栏转到地址:Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters 或手动向下钻取。
        • 右键单击“参数”>新建> DWORD
        • 将新条目重命名为 MaxFieldLength
        • 右键单击新创建的 MaxFieldLength,对其进行修改并将值设置为所需的最大单个标头大小(以字节为单位),确保基数设置为十进制。
        • 对 MaxRequestBytes 执行相同的操作。使其足够高以匹配 MaxFieldLength 中设置的值。
        • 以管理员身份打开命令提示符
        • 输入命令“net stop http”(确保Visual Studio或其他干扰程序已关闭)
        • 输入命令“net start http”

        资源:

        【讨论】:

        • 我在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters 路径中没有看到 MaxFieldLength 我需要创建一个新路径吗?
        • 是的,如果不存在则需要创建
        猜你喜欢
        • 2019-03-17
        • 1970-01-01
        • 2020-05-13
        • 2018-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-27
        相关资源
        最近更新 更多