gpt4 book ai didi

asp.net-core - ASP.NET Core MVC 中浏览器中止时 HttpRequest 不会中止(取消)

转载 作者:行者123 更新时间:2023-12-02 20:45:02 37 4
gpt4 key购买 nike

我编写了以下 MVC Controller 来测试取消功能:

class MyController : Controller
{
[HttpGet("api/CancelTest")]
async Task<IActionResult> Get()
{
await Task.Delay(1000);
CancellationToken token = HttpContext.RequestAborted;
bool cancelled = token.IsCancellationRequested;
logger.LogDebug(cancelled.ToString());
return Ok();
}
}

假设我想取消请求,因此值“true”会记录在上面的 Controller 操作中。如果服务器实现了 IHttpRequestLifetimeFeature,那么这在服务器端是可能的。幸运的是 Kestrel 做到了,这可以通过以下方式完成:

var feature = (IHttpRequestLifetimeFeature) HttpContext.Features[typeof(IHttpRequestLifetimeFeature)];
feature.Abort();

但是问题是我想取消客户端的请求。例如,在浏览器中。在 ASP.NET MVC/WebApi 的预核心版本中,如果浏览器中止请求,取消 token 将自动取消。示例:在 Chrome 中刷新页面几次。在 chrome 开发工具的“网络”选项卡中,您现在可以看到之前的(未完成的)请求已被取消。

问题是:在 Kestrel 上运行的 ASP.NET Core 中,我只能在日志中看到以下条目:

Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -4081 ECANCELED operation canceled

因此,来自浏览器的中止请求确实到达并由 Kestrel 网络服务器处理。但是,它不会影响 Controller 中 HttpContext 的 RequestAborted 属性,因为该方法仍会记录值“false”。

问题:有没有办法中止/取消我的 Controller 的方法,以便 HttpContext.RequestAborted 属性将被标记为已取消?

也许我可以制作一些订阅 Kestrel 操作取消触发器并调用 IHttpRequestLifetimeFeature.Abort() 方法的东西?

更新:我做了一些进一步的测试,看起来 HttpRequest 实际上已中止,但在取消实际发生之前似乎存在某种延迟。延迟与时间无关,并且似乎直接来自 libuv(Kestrel Web 服务器构建于其上的库)。我在 https://github.com/aspnet/KestrelHttpServer/issues/1103 上发布了更多信息

更多更新:问题已移至另一问题,因为上一问题包含多个问题。 https://github.com/aspnet/KestrelHttpServer/issues/1139

最佳答案

事实证明,简单地使用 HttpContext.RequestAborted 确实是正确的方法,但由于 Kestrel 中的错误(FIN/RST 包的处理顺序),请求并未在浏览器中止时中止。

该错误最终应该在 Kestrel 2.0 中得到修复。

请参阅我的问题中的更新以获取更多信息。

关于asp.net-core - ASP.NET Core MVC 中浏览器中止时 HttpRequest 不会中止(取消),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39574061/

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