Webapi 2全局异常处理未提出

时间:2017-05-05 11:10:25

标签: c#-4.0 exception-handling asp.net-web-api2

我正在使用web api 2为客户端开发服务,以管理我们使用ExceptionsFilterAttribute的错误,但是如您所知,在此级别中并不是所有异常都会被捕获。 在protected void Application_AuthenticateRequest(Object sender, EventArgs e)中引发了一些错误,我想处理它们并向我们的客户发送自定义消息以向他提供有关错误的更多详细信息,为此我创建了一个GlobalExceptionHandler

  public class GlobalExceptionHandler: ExceptionHandler
{
//A basic DTO to return back to the caller with data about the error
private class ErrorInformation
{
public string Message { get; set; }
public DateTime ErrorDate { get; set; }
}

public override void Handle(ExceptionHandlerContext context)
{

//Return a DTO representing what happened
context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError,
new ErrorInformation { Message="We apologize but an unexpected error occured. Please try again later.", ErrorDate=DateTime.UtcNow }));

//This is commented out, but could also serve the purpose if you wanted to only return some text directly, rather than JSON that the front end will bind to.
//context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError, "We apologize but an unexpected error occured. Please try again later."));
}
}

在WebApiConfig中我添加了这一行:

config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());

Application_AuthenticateRequest引发了一些错误,但永远无法达到GlobalExceptionHandler

您是否知道如何解决此问题?

提前致谢。

1 个答案:

答案 0 :(得分:1)

Application_AuthenticateRequest不在Web API管道中。因此,如果在此方法中抛出异常,则可以通过Web API异常处理程序捕获这些异常,因为在Web API管道启动之前会抛出异常。

有两种方法可以做到这一点:

  1. 更改身份验证机制并使用Web API身份验证(IAuthenticationFilter)而不是Application_AuthenticateRequest。

    • 如果此项目只有与Web API相关的控制器,而不是像MVC和所有。
  2. 或者在Global.asax.cs文件中使用Application_Error来捕获Application_AuthenticateRequest中抛出的异常