如何在 ASP.NET Web API 中处理控制器操作中的取消?

How to handle cancellation in Controller actions in ASP.NET Web API?

我正在开发具有 Asp.Net 核心的 Web API。

我正在尝试找出在服务器端处理取消的最佳方法。

我通常有一个服务层,并在服务中实现一个 try-catch 块。

在这篇文章中 here 建议实施控制器操作过滤器,它将捕获来自服务的所有 OperationCanceledExceptions 和 return 状态代码 400。

public class OperationCancelledExceptionFilter : ExceptionFilterAttribute
{
    private readonly ILogger _logger;

    public OperationCancelledExceptionFilter(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<OperationCancelledExceptionFilter>();
    }
    public override void OnException(ExceptionContext context)
    {
        if(context.Exception is OperationCanceledException)
        {
            _logger.LogInformation("Request was cancelled");
            context.ExceptionHandled = true;
            context.Result = new StatusCodeResult(400);
        }
    }
}

这意味着我不会在服务层捕获这个异常,而是让它到达控制器动作。

这是您能想到的最佳方法吗?您有更好的方法可以推荐吗?

CancellationToken 一般用于此作业。

例如;

config.MessageHandlers.Add(new CancelledTaskBugWorkaroundMessageHandler());

class CancelledTaskBugWorkaroundMessageHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        // Try to suppress response content when the cancellation token has fired; ASP.NET will log to the Application event log if there's content in this case.
        if (cancellationToken.IsCancellationRequested)
        {
            return BadRequest();
        }

        return response;
    }
}

或者;

app.Use(async (ctx, next) =>
{
    try
    {
        await next();
    }
    catch (OperationCanceledException)
    {
    }
});

希望有用。