已部署 IIS ASP.NET 核心应用程序出现间歇性 431 请求 headers 太长错误
IIS Deployed ASP.NET Core application giving intermittent 431 Request headers too long error
我正在开发 ASP.NET 核心应用程序,它通过 RestSharp
使用 GraphQL
端点来检索数据。这是一个 Intranet 类型的应用程序,部署在 Windows 2016 IIS 服务器上,我们正在使用 Windows 身份验证。我们遇到的问题是属于大量活动目录组的某个用户出现间歇性 431 请求 headers 太长错误。
我尝试了以下操作:
我在 startup.cs
中为应用程序和服务设置 IISDefaults
:
services.AddAuthentication(IISDefaults.AuthenticationScheme);
我在 RestRequest 中传递 UseDefaultCredentials
var client = new RestClient(endpoint);
var request = new RestRequest(Method.POST);
request.UseDefaultCredentials = true;
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", data, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
return response.Content;
将 MaxFieldLength
和 MaxRequestBytes
的注册表项设置为允许的最大值。
从标准输出记录:
info: Microsoft.AspNetCore.Server.Kestrel[17]
Connection id "0HLIABLA41UKH" bad request data: "Request headers too long."
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request headers too long. at Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException.Throw(RequestRejectionReason reason) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TakeMessageHeaders(ReadOnlySequence1 buffer, SequencePosition& consumed, SequencePosition& examined) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.ParseRequest(ReadOnlySequence
1 buffer, SequencePosition& consumed, SequencePosition& examined) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication1 application) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequestsAsync[TContext](IHttpApplication
1 application)
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
这已通过设置 MaxRequestHeadersTotalSize Kestrel 选项解决。默认为 32768。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Limits.MaxRequestHeadersTotalSize = 1048576;
});
有时会发生这种情况,因为您的 AD 帐户位于很多安全组中。如果您减少所在组的数量,您的 Windows 身份验证 header 应该会减小大小,从而允许您提出请求。
如果你不能离开你所在的任何安全组,你将不得不使用其他答案的方法。
这通常被报告为 HTTP 400。
Jonas 走在正确的轨道上,帮助解决了我在 ASP.NET 核心 Web 应用程序中遇到的类似情况。但是,在查看 Kestrel 服务器上的 Microsoft 文档后,我发现如果使用 ASP.NET Core 2.2,Jonas 的方法需要稍微修改 (感谢 @cristi71000 的评论)。大部分功劳仍应归功于@Jonas Wik,他为我们指明了正确的方向。
他建议在创建和配置虚拟主机构建器时链接 UseKestrel()
辅助方法。但是,根据 ASP.NET Core 2.2 的 Microsoft 文档,CreateDefaultBuilder()
已经在幕后调用 UseKestrel()
。当需要额外的配置时,应该使用辅助方法 ConfigureKestrel()
来进一步配置 Kestrel。更新 Jonas 对 ASP.NET Core 2.2 的回答如下所示:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, options) =>
{
options.Limits.MaxRequestHeadersTotalSize = 1048576;
});
完全披露:我都做过,没有注意到差异或任何不利的副作用。但是,最好与他们记录在案的做法保持一致,以确保在未来的开发中不会出现任何偏离 rails 的情况!
我正在开发 ASP.NET 核心应用程序,它通过 RestSharp
使用 GraphQL
端点来检索数据。这是一个 Intranet 类型的应用程序,部署在 Windows 2016 IIS 服务器上,我们正在使用 Windows 身份验证。我们遇到的问题是属于大量活动目录组的某个用户出现间歇性 431 请求 headers 太长错误。
我尝试了以下操作:
我在
startup.cs
中为应用程序和服务设置IISDefaults
:services.AddAuthentication(IISDefaults.AuthenticationScheme);
我在 RestRequest 中传递 UseDefaultCredentials
var client = new RestClient(endpoint); var request = new RestRequest(Method.POST); request.UseDefaultCredentials = true; request.AddHeader("content-type", "application/json"); request.AddParameter("application/json", data, ParameterType.RequestBody); IRestResponse response = client.Execute(request); return response.Content;
将
MaxFieldLength
和MaxRequestBytes
的注册表项设置为允许的最大值。
从标准输出记录:
info: Microsoft.AspNetCore.Server.Kestrel[17] Connection id "0HLIABLA41UKH" bad request data: "Request headers too long." Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request headers too long. at Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException.Throw(RequestRejectionReason reason) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TakeMessageHeaders(ReadOnlySequence
1 buffer, SequencePosition& consumed, SequencePosition& examined) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.ParseRequest(ReadOnlySequence
1 buffer, SequencePosition& consumed, SequencePosition& examined) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication1 application) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequestsAsync[TContext](IHttpApplication
1 application) info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
这已通过设置 MaxRequestHeadersTotalSize Kestrel 选项解决。默认为 32768。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Limits.MaxRequestHeadersTotalSize = 1048576;
});
有时会发生这种情况,因为您的 AD 帐户位于很多安全组中。如果您减少所在组的数量,您的 Windows 身份验证 header 应该会减小大小,从而允许您提出请求。
如果你不能离开你所在的任何安全组,你将不得不使用其他答案的方法。
这通常被报告为 HTTP 400。
Jonas 走在正确的轨道上,帮助解决了我在 ASP.NET 核心 Web 应用程序中遇到的类似情况。但是,在查看 Kestrel 服务器上的 Microsoft 文档后,我发现如果使用 ASP.NET Core 2.2,Jonas 的方法需要稍微修改 (感谢 @cristi71000 的评论)。大部分功劳仍应归功于@Jonas Wik,他为我们指明了正确的方向。
他建议在创建和配置虚拟主机构建器时链接 UseKestrel()
辅助方法。但是,根据 ASP.NET Core 2.2 的 Microsoft 文档,CreateDefaultBuilder()
已经在幕后调用 UseKestrel()
。当需要额外的配置时,应该使用辅助方法 ConfigureKestrel()
来进一步配置 Kestrel。更新 Jonas 对 ASP.NET Core 2.2 的回答如下所示:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, options) =>
{
options.Limits.MaxRequestHeadersTotalSize = 1048576;
});
完全披露:我都做过,没有注意到差异或任何不利的副作用。但是,最好与他们记录在案的做法保持一致,以确保在未来的开发中不会出现任何偏离 rails 的情况!