Nic*_*cht 5 c# kestrel-http-server asp.net-core asp.net-core-2.1
我有一个ASP.NET Core Web应用程序,该应用程序接受经过身份验证的用户上传的文件,并带有一些错误处理,以在发生异常时通知我(Exceptional)。我的问题是,BadHttpRequestException由于用户在覆盖范围不可靠的区域通过移动设备访问应用程序,因此会定期收到的警报。我以前也使用2.0来获得此功能,但是直到异常描述在2.1中进行了更新,我才知道它与明确相关MinRequestBodyDataRate,或者它是可配置的。我用以下命令设置了默认值(240字节,超过5秒钟)
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Limits.MinRequestBodyDataRate = new MinDataRate(240.0, TimeSpan.FromSeconds(10.0));
})
.UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)
这使等待客户端/浏览器的时间延长了一倍,但是我仍然收到错误警报。我无法控制用户的不满意,但是我仍然希望尝试找到一种减轻错误的方法。我可以进一步扩展最小值,但是如果可能的话,我不想在整个应用程序中都这样做。理想情况下,应该是处理上传的特定路线/操作。我能够找到的文档指示可以使用进行配置IHttpMinRequestBodyDataRateFeature。我曾考虑将其放入动作中,但直到模型绑定将整个文件上载以将其绑定到我的参数之前,我什至都不认为该动作被调用。
public async Task<IActionResult> Upload(IFormFile file)
{
var minRequestBodyDataRateFeature = HttpContext.Features.Get<IHttpMinRequestBodyDataRateFeature>();
minRequestBodyDataRateFeature.MinDataRate = new MinDataRate(240, TimeSpan.FromSeconds(30));
myDocumentService.SaveFile(file);
}
Run Code Online (Sandbox Code Playgroud)
我以前已经实现了分块上传,并且仅在最后一个块到来时才将文件保存到服务/数据库中(此文件在它们之间的临时位置逐步构建),从而在一定程度上缓解了这种情况。但是BadHttpRequestException即使通过进行了延长的时间,我仍然会得到这些s CreateWebHostBuilder(未显示块,因为它不相关)。
我认为最好的选择可能是尝试将其连接到设置中间件的configure方法中,但是我不确定将其仅应用于一项操作的最佳方法。网址?我想知道如果我将最小费率设置为完全禁用最小费率会有什么影响null。
我基本上只是希望使连接更能容忍劣质的连接,而又不会在日常工作中为应用程序的其他方面带来太多麻烦。
Startup.Configure()),以使其仅应用于受影响的路由/ URL /操作。我注意到了同样的问题。我有较大的文件可供用户从我的网站下载,并且有些人(根据地区)下载速度较慢,并且下载会在一段时间后停止。我也在日志中看到了异常。
我不建议禁用该功能,因为某些连接卡住或连接速度很慢,这可能是总结。只需增加时间并将速率降低到您可以说您的网页仍然可用的值。
我不会为特定的 URL 这样做。除非您注意到一些性能问题,否则当页面具有相同的设置时不会有什么坏处。
还要记住,还有一个MinResponseDataRate选项。
最好的方法是在应用程序启动时为所有路由设置一些合理的值。日志中总会有一些例外,因为人们失去了与 Internet 的连接,而 Kestrel 必须在一段时间后关闭连接以释放资源。
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 80, gracePeriod: TimeSpan.FromSeconds(20));
options.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 80, gracePeriod: TimeSpan.FromSeconds(20));
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseNLog()
.UseStartup<Startup>()
.Build();
}
Run Code Online (Sandbox Code Playgroud)
另请查看您的异步上传方法。确保你有一个等待或返回一个任务。我不认为它是这样编译的。
| 归档时间: |
|
| 查看次数: |
2558 次 |
| 最近记录: |