前几天在webapi项目中遇到一个问题:Controller构造函数中抛出异常时全局过滤器捕获不到,于是网搜一把写下这篇博客作为总结。


HttpResponseException

通常在WebAPI的Controller中抛出的未处理异常,会以500的形式返回到客户端。而HttpResponseException会返回我们指定的状态码,如返回501:

public HttpResponseMessage Exception()
{
//直接在Action中抛出HttpResponseException类型异常
throw new HttpResponseException(HttpStatusCode.NotImplemented);
}

在抛出HttpResponseException时,可将HttpResponseMessage类型的实例作为参数以提供给客户端更多的信息。

HttpError

public HttpResponseMessage Exception()
{
//使用Request对象创建返回到客户端的错误信息
Request.CreateErrorResponse()
}

CreateErrorResponse方法是HttpResponseMessage类型的可扩展方法,该方法最终会调用扩展方法CreateResponse返回一个HttpResponseMessage类型的对象(ASP.NET WebAPI中Action的返回值最终都会被转换为HttpResponseMessage类型的对象),该对象包含一个HttpError类型实例。

Exception Filters

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

过滤器可分为三个级别:

  • Action
  • Controller
  • Global

注意:ASP.NET MVC和ASP.NET WebAPI的异常过滤器不可混用

ExceptionHandler

以下情形中的异常,过滤器是无法捕获到的:

  • 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:若要记录未处理异常日志可实现接口IExceptionLogger或继承ExceptionLogger

小结

IExceptionFilter只能处理Action中发生的未处理异常,IExceptionHandler可以处理任何地方发生的未处理异常。

相关阅读

catch all unhandled exceptions in ASP.NET Web Api
Handling Errors in Web API Using Exception Filters and Exception Handlers
Exception Handling in ASP.NET Web API
Global Error Handling in ASP.NET Web API 2
Action Results in Web API 2

版权声明

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

如有问题, 请发送邮件和作者联系。

ASP.NET Web API 2中的错误处理的更多相关文章

  1. ASP.NET Web API 2 中的属性路由使用(转载)

    转载地址:ASP.NET Web API 2 中的属性路由使用

  2. [翻译]ASP.NET Web API 2 中的全局错误处理

    目录 已存在的选项 解决方案预览 设计原则 什么时候去用 方案详情 示例 附录: 基类详情 原文链接 Global Error Handling in ASP.NET Web API 2 由于翻译水平 ...

  3. 在ASP.NET Web API 2中使用Owin OAuth 刷新令牌(示例代码)

    在上篇文章介绍了Web Api中使用令牌进行授权的后端实现方法,基于WebApi2和OWIN OAuth实现了获取access token,使用token访问需授权的资源信息.本文将介绍在Web Ap ...

  4. 在ASP.NET Web API项目中使用Hangfire实现后台任务处理

    当前项目中有这样一个需求:由前端用户的一个操作,需要触发到不同设备的消息推送.由于推送这个具体功能,我们采用了第三方的服务.而这个服务调用有时候可能会有延时,为此,我们希望将消息推送与用户前端操作实现 ...

  5. ASP.NET Web API 2 中的特性路由

    ASP.NET MVC 5.1 开始已经支持基于特性的路由(http://attributerouting.net),ASP.NET WEB API 2 同时也支持了这一特性. 启用特性路 由只需要在 ...

  6. asp.net web api 向客户端返回错误信息

    1使用Http状态码 ASP.NET Web Api框架提供了Http状态码的值,如下图所示. 虽然有这些预定义的状态码,但在实际项目中使用自定状态码结合预定义状态码更有优势. 通过在适当的位置抛出异 ...

  7. 在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份 ...

  8. swaggerui在asp.net web api core 中的应用

    Swaggerui 可以为我们的webapi提供美观的在线文档,如下图: 实现步骤: NuGet Packages  Install-Package Swashbuckle.AspNetCore 在s ...

  9. 【swaggerui】swaggerui在asp.net web api core 中的应用

    Swaggerui 可以为我们的webapi提供美观的在线文档,如下图: 实现步骤: NuGet Packages  Install-Package Swashbuckle.AspNetCore 在s ...

随机推荐

  1. 201521123016《Java设计与程序》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  2. 201521123026 《Java程序设计》第6周学习总结

    1. 本章学习总结 请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结 2. 书面作业 Q1.clone方法 1.1 Object对象中的clone方法是被prot ...

  3. 201521123032《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 参考资料: 百度脑图 XMind 2. 书面作业 作业参考文件下载 1. 代码阅 ...

  4. 201521123088《JAVA程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出 ...

  5. Java课程设计 - 学生基本信息管理

    团队名称.团队成员介绍(需要有照片) 团队名称:此艺兴非彼艺兴 团队成员: 王兴:女,积极上进 曾艺佳:女,积极上进 项目git地址 StudentManage项目 项目git提交记录截图(要体现出每 ...

  6. 201521123096《Java程序设计》第十二周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  7. linux(4) vi编辑/删除、复制、粘贴 /bash shell 环境变量设置/数据流重定向 | 的用法

    一.vi文字处理器1.vi与vimvi:文字处理器vim:程序开发工具2.vi介绍三种模式:一般模式(vi刚进入的,不可编辑),编辑模式(按i后,左下方是insert)和命令行模式(按esc退出,:w ...

  8. dotnet core 2.0在ubuntu下安装失败

    在ubuntu下安装.net core2.0失败了,不知道是什么原因.按照微软官方的步骤.似乎走不通.偶然翻到debian的安装方法,发现debian系统居然是直接下载包安装的.没经过apt.尝试一把 ...

  9. String... args 和 String[] args 的区别

    public static void main(String[] args) { callMe1(new String[] { "a", "b", " ...

  10. Day-1:初识开发板与基础知识

    买的这款51,ARM,AVR三合一的单片机,也不知道后面具体使用会不会有问题,先玩玩看吧. ------------------------------------------------------ ...