捕获ASP.NET MVC + Web Api中的所有异常

时间:2017-01-17 13:01:54

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

我知道关于这个主题有很多线索,但没有一个提供完整且完整的解决方案。

方案

我有一个提供MVC 5和Web Api 2.2控制器的应用程序。 我需要捕获所有异常(包括404,401)并始终返回自定义JSON错误结构。

部分解决方案

到目前为止,我已经实现了一个自定义ExceptionFilterAttribute,如下所示:

public class ExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        context.Response = context.Request.CreateResponse(
            HttpStatusCode.InternalServerError,
            new
            {
                Title = "An Error occured while processing the request",
                Message = context.Exception.ToString(),
                Type = "Error",
                Code = context.Exception.HResult
            });
        context.Response.ReasonPhrase = "An Error occurred while processing the request";
    }
}

然后我也扩展并替换了可用的ExceptionHandler服务,如下所示:

public class GenericExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        context.Result = HttpResponseFactory.BadResponse(
            context.Request,
            "An unhandled error occurred",
            context.Exception.Message,
            10000);
    }   
}

我在初始化期间交换了两个:

public static void Register(HttpConfiguration config)
{
    // authentication
    config.Filters.Add(new AuthorizeAttribute());
    // error handler
    config.Filters.Add(new ExceptionFilter());
    // error service
    config.Services.Replace(typeof(IExceptionHandler), new GenericExceptionHandler());
}

不幸的是,当我生成:

  1. 401 - 未经授权
  2. 404 - 未找到
  3. 某些500 - 内部服务器错误
  4. 我无法捕获异常。有没有办法实现它?

1 个答案:

答案 0 :(得分:0)

将其放入Global文件中:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();

    // Do something with the error.
    System.Diagnostics.Debug.WriteLine(exception);

    // Redirect somewhere or return an error code in case of web api
    Response.Redirect("/Home/Error");
}

任何时候,发生错误,ASP MVC都会调用该方法。