我们可以在 Windows 中将 http 标头大小增加到超过 64kb吗

问题描述 投票:0回答:2

我遇到的情况是,特定用户的 HTTP 授权请求标头 大小超过 64kb(大约 90kb)。尺寸较大的原因是因为标头包含不记名令牌,并且发起http请求的用户有很多声明。

问题是对于这个特定用户,网络服务器总是返回一个错误,指出:

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

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

在调查问题时,我遇到了 http.sys 参数 以及此表:(摘录)

注册表键 默认 有效值范围 注册表键功能
MaxFieldLength
16384 64 - 65534
(64k - 2)字节
为每个标头设置上限。请参阅
MaxRequestBytes
。此限制相当于 URL 的大约 32k 个字符。
MaxRequestBytes
16384 256 - 16777216
(16 MB) 字节
确定请求行和标头总大小的上限。
其默认设置为 16 KB。如果该值低于
MaxFieldLength
,则调整
MaxFieldLength
值。

它表示

MaxFieldLength
的最大值是64kb,这表示
http.sys
处理的最大标头长度,而我的服务器设置为最大值,即65,536。

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

那么还有其他方法可以增加标头最大长度吗?

asp.net windows http owin http.sys
2个回答
0
投票

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

您修改

MaxFieldLength
是正确的,但是,您还必须按照
文档
中所述修改MaxRequestBytes

解决方法 2:设置 MaxFieldLength 和 MaxRequestBytes 注册表项:

默认情况下,没有 MaxFieldLength 注册表项。此条目指定每个 HTTP 请求标头的最大大小限制。 MaxRequestBytes 注册表项指定请求行和标头总大小的上限。通常,此注册表项与 MaxRequestBytes 注册表项一起配置。

如果 MaxRequestBytes 值小于 MaxFieldLength 值, MaxFieldLength 值已调整。在大型 Active Directory 中 环境中,如果以下值,用户可能会遇到登录失败的情况 这两个条目都没有设置为足够高的值。

您必须在以下位置添加/修改这些条目:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters 

对于 IIS 6.0 及更高版本,MaxFieldLength 和 MaxRequestBytes 注册表项位于以下子项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters


0
投票

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

免责声明:这更多的是一种解决方法,而不是正确的解决方案。

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

  • 将每个 GET 请求转换为 POST 请求,并将任何适用的查询参数作为请求正文中的键值对传递。
  • 在每个请求正文中添加一个附加键
    "access_token"
    ,其值为
    bearer token
    ,用于处理授权。忽略未受保护的端点。
  • 更新文档并通过清晰的示例告知所有最终用户所做的更改。
  • "Deprecated"
    标签装饰旧版本。
© www.soinside.com 2019 - 2024. All rights reserved.