如何在 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)
{
}
});
希望有用。
我正在开发具有 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)
{
}
});
希望有用。