C# IIS部署的ASP.NET核心应用程序给出的间歇431请求头太长错误
我正在开发一个ASP.NET核心应用程序,它通过C# IIS部署的ASP.NET核心应用程序给出的间歇431请求头太长错误,c#,iis,asp.net-core,kestrel-http-server,C#,Iis,Asp.net Core,Kestrel Http Server,我正在开发一个ASP.NET核心应用程序,它通过RestSharp使用GraphQL端点来检索数据。这是一个内部网类型的应用程序,部署在Windows 2016 IIS服务器上,我们正在使用Windows身份验证。我们遇到的问题是,某个属于大量active directory组的用户正在收到间歇性的431请求头过长错误 我尝试了以下几点: 我正在为应用程序和服务设置startup.cs中的IISDefaults: services.AddAuthentication(IISDefaults.Au
RestSharp
使用GraphQL
端点来检索数据。这是一个内部网类型的应用程序,部署在Windows 2016 IIS服务器上,我们正在使用Windows身份验证。我们遇到的问题是,某个属于大量active directory组的用户正在收到间歇性的431请求头过长错误
我尝试了以下几点:
startup.cs
中的IISDefaults
:
services.AddAuthentication(IISDefaults.AuthenticationScheme);
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
的注册表项设置为允许的最大值1缓冲区,SequencePosition&consumed,SequencePosition&Inspected)位于Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.ParseRequest(ReadOnlySequence
1缓冲区,SequencePosition&consumed,SequencePosition&Inspected,SequencePosition&Inspected),位于Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult结果,布尔值和endConnection)在Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication1应用程序)在Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequestsAsync[TContext](IHttpApplication
1应用程序)
信息: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;
});
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.UseKestrel(选项=>
{
options.Limits.MaxRequestHeadersTotalSize=1048576;
});
这有时会发生,因为您的广告帐户位于许多安全组中。如果减少所属组的数量,则Windows auth标头的大小应减小,从而允许您发出请求
如果您不能离开您所在的任何安全组,则必须使用其他答案的方法
这通常被称为HTTP 400
乔纳斯走上了正确的道路,帮助解决了我在ASP.NET核心web应用程序中遇到的类似情况。然而,在查看Kestrel服务器上的Microsoft文档后,我发现如果使用ASP.NET Core 2.2,Jonas的方法需要稍微修改(感谢@cristi71000的评论)。大部分功劳都应该归于@Jonas Wik,因为他为我们指明了正确的方向 他建议在创建和配置web主机生成器时链接
UseKestrel()
helper方法。但是,根据Microsoft针对ASP.NET Core 2.2的文档,CreateDefaultBuilder()
已经在幕后调用了UseKestrel()
。当需要额外配置时,应使用助手方法ConfigureKestrel()
进一步配置Kestrel。更新Jonas对ASP.NET Core 2.2的回答时,应如下所示:
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.ConfigureKestrel((上下文、选项)=>
{
options.Limits.MaxRequestHeadersTotalSize=1048576;
});
充分披露:我已经做了这两件事,没有注意到任何差异或任何不良副作用。然而,最好遵守他们的文档化实践,以确保在未来的开发中不会出现任何问题
该用户是500多个Active Directory组的管理员和成员。这是针对ASP.NET Core 2.2的。Jonas的答案是ASP.NETCore2。1@cristi71000谢谢你的意见。我已经更新了我的答案。我在问题或Jonas的回答中没有看到任何指示ASP.NET Core特定版本的内容,但在查看文档后,我确实看到配置Kestrel的过程确实从v2.1更改为v2.2。我修改了我的答案,希望能为其他读者指出正确的方向,如果他们的目标是v2.2。