1 回答
TA贡献1998条经验 获得超6个赞
为了通知 ASP.NET Core MVC 管道您已处理异常,您需要设置ActionExecutedContext.ExceptionHandled为true. 因为您在显示的代码中没有此功能,所以 ASP.NET Core MVC 管道使用其自己的错误处理逻辑将您的(它认为是)未处理的异常转换为 500 响应。
现在 - 此属性存在于ActionExecutedContext而不是ActionExecutingContext(您在代码中使用)。这是有道理的,因为它ActionExecutingContext代表了动作运行之前的状态,也代表了动作运行之后的ActionExecutedContext状态。这意味着您将需要以下一组更改:
更新你的OnExceptionAsync函数来ActionExecutedContext代替ActionExecutingContext.
更新对 的调用OnExceptionAsync,提供executed而不是context。当您在这里时,您还可以将方法参数折叠为仅 executed(我将在下面的代码中显示)。
设置context.ExceptionHandled为true一旦你已经处理了异常。:)
我已经从您的问题中获取了代码,删除了一些与问题无关的代码并应用了这些更改,我用上面的相应数字调用了这些更改:
public abstract class GenericActionFilter : ActionFilterAttribute
{
public override async Task OnActionExecutionAsync(ActionExecutingContext context,
ActionExecutionDelegate next)
{
if (await OnBeforeActionExecutionAsync(context))
{
var executed = await next();
if (executed.Exception != null && !executed.ExceptionHandled)
{
await OnExceptionAsync(executed); // #2.
}
else
{
// NOTE: You might want to use executed here too.
await OnAfterActionExecutionAsync(context);
}
}
}
// ...
public virtual Task OnExceptionAsync(ActionExecutedContext context) // #1.
{
return Task.CompletedTask;
}
}
public class ExceptionFilter : GenericActionFilter
{
public override Task OnExceptionAsync(ActionExecutedContext context) // #1, #2.
{
Logger.Error(context.Exception); // #2 (single parameter).
context.Result = new ContentResult { ... };
context.ExceptionHandled = true; // #3.
return Task.CompletedTask;
}
}
- 1 回答
- 0 关注
- 334 浏览
添加回答
举报