【发布时间】:2021-10-17 18:32:11
【问题描述】:
ASP.NET Core MVC 提供了在请求被客户端中止时处理情况的方法。框架传递了CancellationToken,可以通过HttpContext.RequestAborted属性访问,也可以绑定到控制器的action中。
在 .NET 方面,这种方法看起来非常清晰、一致和自然。对我来说看起来不自然和不合逻辑的是那个框架,它初始化、填充和“取消”这个访问令牌没有处理适当的TaskCancelledException。
如果
-
我从“ASP.NET Core Web API”模板创建一个新项目,
-
添加带有
CancellationToken参数的操作,如下所示:[HttpGet("Delay")] public async Task<IActionResult> GetDelayAsync(CancellationToken cancellationToken) { await Task.Delay(30_000, cancellationToken); return Ok(); } -
然后通过邮递员发送请求并在完成前取消它
然后应用程序在日志中记录这个错误:
失败:Microsoft.AspNetCore.Server.Kestrel[13]
连接 ID“0HMCHB3SQHQQR”,请求 ID“0HMCHB3SQHQQR:00000002”:应用程序抛出了未处理的异常。
System.Threading.Tasks.TaskCanceledException:任务被取消。
>
我的期望是这种特殊情况下的异常由 asp.net 处理和吸收,日志中没有“失败”记录。
错误行为应该与同步操作相同:
[HttpGet("Delay")]
public IActionResult GetDelay()
{
Thread.Sleep(30_000);
return Ok();
}
当请求中止时,此实现不会在日志中记录任何错误。
从技术上讲,异常过滤器可以吸收和隐藏异常,但这种方法看起来很奇怪且过于复杂。至少因为这是常规情况,为任何应用程序编写代码没有任何意义。另外,我想隐藏“当客户端对响应不感兴趣时由中止请求引起的异常”,并且与其他未处理的 TaskCancelledException 相关的行为应该保持原样......
我想知道当请求被客户端中止时,它应该如何以及何时正确处理和吸收异常?
有很多文章如何访问取消令牌,但是我找不到任何明确的陈述来回答我的问题。
【问题讨论】:
标签: asp.net-core asp.net-core-mvc