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 關注
- 353 瀏覽
添加回答
舉報