本文共 1533 字,大约阅读时间需要 5 分钟。
前几天在webapi项目中遇到一个问题:Controller构造函数中抛出异常时全局过滤器捕获不到,于是网搜一把写下这篇博客作为总结。
通常在WebAPI的Controller中抛出的未处理异常,会以500的形式返回到客户端。而HttpResponseException
会返回我们指定的状态码,如返回501:
public HttpResponseMessage Exception(){ //直接在Action中抛出HttpResponseException类型异常 throw new HttpResponseException(HttpStatusCode.NotImplemented);}
在抛出HttpResponseException
时,可将类型的实例作为参数以提供给客户端更多的信息。
public HttpResponseMessage Exception(){ //使用Request对象创建返回到客户端的错误信息 Request.CreateErrorResponse()}
CreateErrorResponse
方法是HttpResponseMessage
类型的可扩展方法,该方法最终会调用扩展方法CreateResponse
返回一个HttpResponseMessage
类型的对象(ASP.NET WebAPI中Action的返回值最终都会被转换为HttpResponseMessage类型的对象),该对象包含一个HttpError
类型实例。
自定义派生自或的异常处理类用于异常的处理。
过滤器可分为三个级别:
注意:ASP.NET MVC和ASP.NET WebAPI的异常过滤器不可混用
以下情形中的异常,过滤器是无法捕获到的:
Controller构造函数中抛出的异常
中抛出的异常
路由过程中出现的异常
其它过滤器中抛出的异常
序列化返回内容时抛出的异常
解决方案如下:
自定义异常处理器,两种方式public class XfhExceptionHandler : ExceptionHandler{ public override void Handle(ExceptionHandlerContext context) { context.Result = new ResponseMessageResult( context.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "发生了不可描述的错误!") ); //new InternalServerErrorResult(context.Request); }}
替换ASP.NET WebAPI默认的异常处理器
public static void Register(HttpConfiguration config){ config.Services.Replace(typeof(IExceptionHandler), new XfhExceptionHandler());}
PS:若要记录未处理异常日志可实现接口或继承
IExceptionFilter只能处理Action中发生的未处理异常,IExceptionHandler可以处理任何地方发生的未处理异常。
本文为作者原创,版权归作者所有。 转载必须保留文章的完整性,且在页面明显位置处标明。
如有问题, 请和作者联系。