gpt4 book ai didi

c# - 如果 POST 请求中的文件总大小超过 30MB,ASP.NET Core 将抛出 -4077 ECONNRESET

转载 作者:太空宇宙 更新时间:2023-11-03 14:42:03 25 4
gpt4 key购买 nike

我不明白为什么当我尝试向 Kestrel 上传大文件时,准确地说,当它超过 30MB 时,Kestrel 一直关闭连接。

我知道 Kestrel 在最大请求大小方面的默认设置为 30MB,我已尝试在 web.config 文件中将最大请求大小增加到 100MB:

<security>
<requestFiltering allowDoubleEscaping="true">
<!-- This will handle requests up to 100MB -->
<requestLimits maxAllowedContentLength="104857600" />
</requestFiltering>
</security>

我也尝试在引导服务器时配置它:

WebHost.UseKestrel(options => options.Limits.MaxRequestBodySize = 104857600) // 100MB

[...]

services.Configure<FormOptions>(options => options.MultipartBodyLengthLimit = 104857600); // 100MB

我试过在中间件中设置它:

var maxRequestBodySizeFeature = httpContext.Features.Get<IHttpMaxRequestBodySizeFeature>();
maxRequestBodySizeFeature.MaxRequestBodySize = 104857600;

我已经尝试了所有我能找到的东西,例如这里的建议:

Increase upload file size in Asp.Net core

在这里:

https://www.talkingdotnet.com/how-to-increase-file-upload-size-asp-net-core/

但是一旦我的 POST 请求包含多个文件,这些文件加在一起超过 30MB 限制,当执行以下行时:

foreach (var entry in httpContext.Request.Form /* Exception is thrown by Form property */)
{
}

我得到以下异常:

[Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal.ConnectionResetException] - Error -4077 ECONNRESET connection reset by peer
at Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.PipeCompletion.ThrowFailed()
at Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.Pipe.GetResult(ReadResult& result)
at Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.Pipe.Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.IReadableBufferAwaiter.GetResult()
at Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.ReadableBufferAwaitable.GetResult()
at Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal.LibuvOutputConsumer.<WriteOutputAsync>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.WebUtilities.BufferedReadStream.<EnsureBufferedAsync>d__37.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.WebUtilities.MultipartReaderStream.<ReadAsync>d__36.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.WebUtilities.StreamHelperExtensions.<DrainAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.WebUtilities.MultipartReader.<ReadNextSectionAsync>d__20.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Http.Features.FormFeature.<InnerReadFormAsync>d__18.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Http.Features.FormFeature.ReadForm()
[...]

据我所知,这不是浏览器关闭连接。在浏览器中,我只是选择一堆文件并上传它们,然后立即在 Visual Studio 中抛出异常。一切都在本地主机上完成。

最佳答案

我使用以下设置成功提供了 11 个 7mb 文件:

初始设置:

WebHost.CreateDefaultBuilder(args)
.ConfigureKestrel(options =>
{
options.Limits.MaxRequestBodySize = 104857600;
})

Startup.cs 中设置 MultipartBodyLengthLimit:

services.Configure<FormOptions>(options => options.MultipartBodyLengthLimit = 104857600);

RunExtensions.Run 中:

Microsoft.AspNetCore.Builder.RunExtensions.Run(app, request =>
{
if (request.Request.Path.Value == "/test")
{
foreach (var file in request.Request.Form.Files)
{
// No exceptions
}
}
return Task.CompletedTask;
});

关于c# - 如果 POST 请求中的文件总大小超过 30MB,ASP.NET Core 将抛出 -4077 ECONNRESET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com