【发布时间】:2016-12-02 11:23:15
【问题描述】:
在使用常规 ASP.NET Web API 多年后,我将 ASP.NET Core 用于我的新 REST API 项目。我没有看到任何处理 ASP.NET Core Web API 异常的好方法。我试图实现一个异常处理过滤器/属性:
public class ErrorHandlingFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
HandleExceptionAsync(context);
context.ExceptionHandled = true;
}
private static void HandleExceptionAsync(ExceptionContext context)
{
var exception = context.Exception;
if (exception is MyNotFoundException)
SetExceptionResult(context, exception, HttpStatusCode.NotFound);
else if (exception is MyUnauthorizedException)
SetExceptionResult(context, exception, HttpStatusCode.Unauthorized);
else if (exception is MyException)
SetExceptionResult(context, exception, HttpStatusCode.BadRequest);
else
SetExceptionResult(context, exception, HttpStatusCode.InternalServerError);
}
private static void SetExceptionResult(
ExceptionContext context,
Exception exception,
HttpStatusCode code)
{
context.Result = new JsonResult(new ApiResponse(exception))
{
StatusCode = (int)code
};
}
}
这是我的启动过滤器注册:
services.AddMvc(options =>
{
options.Filters.Add(new AuthorizationFilter());
options.Filters.Add(new ErrorHandlingFilter());
});
我遇到的问题是,当我的AuthorizationFilter 发生异常时,ErrorHandlingFilter 没有处理它。我期待它会像使用旧的 ASP.NET Web API 一样被捕获。
那么我怎样才能捕获所有应用程序异常以及来自操作过滤器的任何异常?
【问题讨论】:
-
你试过
UseExceptionHandler中间件吗? -
作为一种选择,尝试在不抛出异常的情况下处理
NotFound。像 github.com/AKlaus/DomainResult 这样的 NuGet 包在这里会有所帮助。 -
@AlexKlaus 代码中的噪音太大了。我永远不会向任何人推荐它。
标签: c# exception asp.net-core