在 ASP.NET Web API 中使用 Attribute 统一处理异常
并非所有的异常都需要 try-catch 进行重复的处理,这会导致大量的重复性代码,一旦后续系统出现异常处理机制的修改,随着代码量增多,修改也会变的更加困难。 ASP.NET Web API 中特别增加了全局异常过滤器功能,诸如于此的还有很多过滤器可供开发者选择,以实现面向切面编程,它们在取代重复性编码这一目标的路上,作出很多贡献,同时降低了后期维护代码的难度,提升了可读性。 大多数异常处理的 try-catch 都通常是同样的写法(记录异常日志、返回错误信息等),因此我们可以将他们统一写在一个过滤器中,让 API 在出现异常时,即使没有使用 try-catch 嵌套异常位置和解决方案,也能够自动进入期望的异常处理方法。
Get Start 下面我们以一个最简单的异常处理过滤器代码为例,来说明应当如何使全局异常处理器生效: 1.创建一个类 MyExceptionFilterAttribute,继承 ExceptionFilterAttribute,System.Web.Mvc.IExceptionFilter 并实现接口方法
namespace WebAPITest.Filters ??????? //真正能让API全局异常过滤器在出现异常时生效的是这个家伙: ??????????? actionExecutedContext.Response = new HttpResponseMessage() { Content = new StringContent("出现异常") }; ??????? } } 2.为此全局异常处理器进行注册: 打开文件夹 App_Start 下的 FilterConfig.cs 为过滤器注册,由此才能使得过滤器生效。
作为特性标签使用 当然,上述 MyExceptionFilterAttribute 除了可注册为全局异常过滤器以外,也可以单独为 API 中的某些方法使用:(注意,方法本身就是"try",过滤器是"catch"。所以不再需要在方法体内再次 try-catch) using System.Net.Http; namespace WebAPITest.Controllers ??????? [MyExceptionFilter]???? //同上,这一特性标签将帮助 SystemException 方法处理异常。 ??? } 标签与全局注册的优先级问题 多个特性标签,可以全局注册,可以单独在方法名称上、类名上混合使用,那么如果一个标签被全局注册,另一个标签被单独打在方法名上或者类名上,则最终哪一个处理器的方法会被触发? 这些家伙的优先级其实和 css 层叠样式表的优先级相仿。 即:如果我们全局注册过一个过滤器A,又在 ApiController 类的最顶端打了另外一个B、又在Action方法上打了第三个异常处理器C,那么默认只会执行最靠近 Action 的C处理器,也就是说:ActionFilter > ClassFilter > GlobalFilter。 另外如果需要多次执行全部生效,即:全局一次,Controller类一次,Action一次,那么则需要为过滤器顶端加那么一个标签 [AttributeUsage(AttributeTargets.All,AllowMultiple = true)],然后当异常触发时,他们就能够支持多次执行。 当然,真正的异常处理还会涉及很多复杂的内容,这只是一个概览。例如返回值需要被标准化(包含状态码、消息、响应流等内容),调用异常处理工具向服务器发送异常信息记录,记录请求参数,对GET/POST请求导致异常的差异化处理方法等。 但我们在这里提供的是一个思路,让你知道,精简代码、提升开发效率其实可以有更多的方法和可能性。而不必非要使用同一种方式,当你觉得某些步骤一直在不断重复,则应当已经有早期的开发者给出了解决方案,而你需要去发现他们。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET – 图像未显示
- ASP.NET潜在危险请求Javascript正则表达式
- 在加载asp.net页面时显示gif
- asp.net-mvc – 在IIS6上使用jqGrid和ASP.NET MVC 2找不到P
- asp.net-core – 我的自定义ASP.Net 5 MVC 6 Tag Helpers是
- asp.net – 如何修复“System.Security.Permissions.Securi
- 使用Asp.NET标识进行LDAP身份验证
- asp.net-mvc – 将asp.net mvc beta部署到iis 6,导致404
- asp.net-mvc – 已经处理了DbContext和autofac
- asp.net-mvc – 将数据动态绑定到asp.net mvc中的下拉列表
- asp.net-mvc – 如何使actionFilter on action方
- 当我与Fiddler核实时,为什么我的asp.net mvc应用
- asp.net-mvc – 是否可以手动更新ModelState.IsV
- asp.net-mvc-routing – ASP.NET 4 MVC Web API:
- entity-framework – 未运行SetInitializer但EF仍
- asp.net-mvc – 未提供所需的防伪标记或无效 –
- asp.net-mvc-4 – 在EF迁移配置类的Seed方法中获
- 在Entity Framework中使用存储过程(一):实现存
- 是否有比ASP.NET成员资格提供程序更现代的会员/安
- 动态数据 – ASP.NET动态数据向页面添加其他过滤