我们可以在 Windows 中将 http header 大小增加到 64kb 以上吗

Can we increase http header size beyond 64kb in Windows

我遇到的情况是 HTTP 授权请求 header 大小超过 64kb(大约 90kb)特定用户。大的原因是header包含了一个bearer token,发起http请求的用户有很多claims。

问题是对于这个特定的用户,Web 服务器总是 returns 一个错误说明:

"HTTP Error 400. The size of the request headers is too long".

Web 应用程序使用 Microsoft owin 在控制台应用程序中自行托管,因此不涉及 iis。

在调查问题时,我遇到了 following document。它表示 MaxFieldLength 的最大值为 64kb,表示由 http.sys 处理的最大 header 长度,我的服务器设置为最大值 i,e 65,536.

出于好奇,我尝试将值进一步增加到 131,072,但正如预期的那样,它并没有解决问题。

那么有没有其他方法可以增加 header 最大长度?

我遇到了这个问题并通过增加注册表中设置的限制解决了它。 (打开命令并键入 regedit)。

您修改 MaxFieldLength 是正确的,但是,您还必须修改 MaxRequestBytes,如 documentation:

中所述

Workaround 2: Set MaxFieldLength and MaxRequestBytes registry entries:

By default, there is no MaxFieldLength registry entry. This entry specifies the maximum size limit of each HTTP request header. The MaxRequestBytes registry entry specifies the upper limit for the total size of the Request line and the headers. Typically, this registry entry is configured together with the MaxRequestBytes registry entry.

If the MaxRequestBytes value is lower than the MaxFieldLength value, the MaxFieldLength value is adjusted. In large Active Directory environments, users may experience logon failures if the values for both these entries aren't set to a sufficiently high value.

您必须 add/modify 这些条目:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters 

For IIS 6.0 and later, the MaxFieldLength and MaxRequestBytes registry keys are located at the following sub key: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

在意识到 http.sys 服务器无法将大小限制增加到超过规定的最大值后,已实施以下解决方案来解决手头的问题。

Disclaimer: It is more of a workaround than a proper solution.

创建具有以下更改的现有控制器的新版本(v2,因为这些是重大更改):

  • 将每个 GET 请求转换为 POST 请求,并将任何适用的查询参数作为键值对传递到请求正文中。
  • 在每个请求正文中添加一个附加键 "access_token",值为 bearer token 用于处理授权。忽略不受保护的端点。
  • 更新文档并告知所有最终用户有关使用清晰示例所做的更改。
  • "Deprecated" 标签修饰旧版本。