博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Web API 2中的错误处理
阅读量:7155 次
发布时间:2019-06-29

本文共 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类型实例。

Exception Filters

自定义派生自或的异常处理类用于异常的处理。

过滤器可分为三个级别:

  • Action
  • Controller
  • Global

注意: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可以处理任何地方发生的未处理异常。

相关阅读

版权声明

本文为作者原创,版权归作者所有。 转载必须保留文章的完整性,且在页面明显位置处标明。

如有问题, 请和作者联系。

你可能感兴趣的文章
HTML5从零开始构建HTML 5 Web页面
查看>>
centos新增网卡未见到
查看>>
实体机关闭后再启动,kvm中虚拟机无法启动的问题
查看>>
日期正则表达式
查看>>
Maven多模块设置保持JDK版本一致
查看>>
PHP5.2X 升级到PHP5.3.X之后注意事项
查看>>
oracle控制文件的一点研究
查看>>
Spring Boot log backed logstash
查看>>
酷派新机型只做3G是一种勇气
查看>>
yum 错误
查看>>
Linux命令之ls
查看>>
gcc --hash-style
查看>>
PHP 显示表格(需要输入数量)
查看>>
根据颜色值获取颜色常量名: ColorToIdent
查看>>
测试人员提高业务掌握度的方案
查看>>
Juniper总结(一)——路由器体系结构
查看>>
关于static 关键字
查看>>
ftp
查看>>
利用border 产生尖角
查看>>
sync_supers 线程造成 CPU user time 达到80%
查看>>