gpt4 book ai didi

c# - BadHttpRequestException 由于 MinRequestBodyDataRate 和连接不良

转载 作者:太空狗 更新时间:2023-10-30 01:29:41 26 4
gpt4 key购买 nike

我有一个 ASP.NET Core Web 应用程序,它接受来自经过身份验证的用户的文件上传,以及一些错误处理以在发生异常时通知我 (Exceptional)。我的问题是,由于用户在覆盖范围不可靠的地区通过移动设备访问应用程序,我会定期收到有关 BadHttpRequestException 的警报。我以前也用 2.0 得到过这个,但是直到异常描述在 2.1 中得到更新,我才知道它与 MinRequestBodyDataRate 具体相关,或者它是可配置的。我已经用以下内容设置了默认值(5 秒内 240 个字节)

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Limits.MinRequestBodyDataRate = new MinDataRate(240.0, TimeSpan.FromSeconds(10.0));
})
.UseStartup<Startup>();

这会使等待客户端/浏览器的时间加倍,但我仍然收到错误警报。我无法控制用户的不良 react ,但我仍然希望尝试找到一种方法来减少错误。我可以进一步扩展最小值,但如果可能的话,我不想对整个应用程序都这样做。理想情况下,它应该是处理上传的特定路由/操作。我能够找到的文档表明可以使用 IHttpMinRequestBodyDataRateFeature 配置此最小值。我考虑过将它放在 Action 中,但我认为在模型绑定(bind)上传整个文件以便将其绑定(bind)到我的参数之前, Action 甚至不会被调用。

public async Task<IActionResult> Upload(IFormFile file)
{
var minRequestBodyDataRateFeature = HttpContext.Features.Get<IHttpMinRequestBodyDataRateFeature>();
minRequestBodyDataRateFeature.MinDataRate = new MinDataRate(240, TimeSpan.FromSeconds(30));
myDocumentService.SaveFile(file);
}

我之前实现了分块上传,并且只在最后一个 block 到达时才将文件保存到服务/数据库(在中间的临时位置逐渐构建文件),这在一定程度上缓解了这一点。但即使通过 CreateWebHostBuilder 完成了延长的持续时间,我仍然会收到这些 BadHttpRequestException(未显示分块,因为它不相关)。

我认为最好的办法可能是尝试将其连接到设置中间件的配置方法中,但我不确定仅将其应用于一个操作的最佳方法。网址也许?我想知道如果我通过将最低利率设置为 null 来完全禁用它会产生什么影响。

我基本上只是希望让连接更能容忍质量较差的连接,同时又不会对应用程序的其他方面造成太多日常干扰。

  1. 我需要一种方法来应用更改(可能在中间件 Startup.Configure() 中),以仅适用于受影响的路由/url/操作的方式。
  2. 如果我为该路由/url/操作完全禁用它(而不是扩大它),是否需要考虑影响?整个应用程序?
  3. 做不到这些,简单地忽略这些错误并且从不记录它们是否安全?我是否为与应用程序/服务器的恶意交互创建了盲点?

最佳答案

我也注意到了同样的问题。我有更大的文件,用户可以从我的网站下载,有些人,根据地区,下载速度很慢,下载会在一段时间后停止。我还在日志中看到异常。

我不建议禁用该功能,因为可能会出现一些卡住或非常慢的连接。只需增加时间并将速率降低到您可以说您的网页仍然可用的值。

我不会为特定的 URL 这样做。除非您注意到某些性能问题,否则当页面具有相同设置时不会有什么坏处。

另请记住,还有一个 MinResponseDataRate 选项。

最好的方法是在应用程序启动时为所有路由设置一些合理的值。人们在日志中总是会出现与互联网连接断开的异常情况,而 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();
}

另请查看您的异步上传方法。确保您有等待或返回任务。我不认为它是这样编译的。

关于c# - BadHttpRequestException 由于 MinRequestBodyDataRate 和连接不良,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50401622/

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