ASP.NET Core过滤器:身份验证、异常处理、模型验证等
2017-02-14 本文已影响427人
张蘅水
一.用过滤器来偷懒
使用过滤器的好处是实现关注点分离,尽量偷懒,避免重复代码。
本文主要是介绍过滤器在webapi中的常用使用方法,但过滤器不是专属于webapi,甚至消息队列中都可以使用过滤器。
关于在asp.net core mvc中使用过滤器可以参考官方的英文文档或者国内的翻译文档
本文使用的代码:ZHS
二.用法举例说明
1.身份验证
这里不涉及到具体那种技术实现的身份验证,使用Microsoft.AspNetCore.Authorization自带的验证,可以看到,[Authorize()]会去执行对应的验证(此处500是因为没有具体的验证,无法执行),而[AllowAnonymous](允许任何人)和不加过滤器标签是可以访问的。如果使用了全局的身份验证过滤器,这里的[Authorize]和 [AllowAnonymous]是会覆盖掉之前的全局身份过滤器。
可以肯定的一点:合理使用全局和局部过滤器就可以使我们避免写过多的逻辑。
![](https://img.haomeiwen.com/i3913171/1a7c1e7903c02bda.jpg)
![](http://upload-images.jianshu.io/upload_images/3913171-e55bab6604c55403.jpg)
![](http://upload-images.jianshu.io/upload_images/3913171-5ca8f6aac60c949e.jpg)
2.异常处理
使用异常过滤器避免自己手写一大堆try catch和记录日志,同时对特定错误进行特定的处理是很有效果的。除了必须的日志记录,友好的返回结果也是很有意义的,如果是mvc可以直接返回一个对用户友好的错误页面,webapi则看情况是否要返回错误信息。
![](http://upload-images.jianshu.io/upload_images/3913171-d6123ca00ee2ff3b.jpg)
![](http://upload-images.jianshu.io/upload_images/3913171-1000001a127bc919.jpg)
需要注意一点:在方法年内对异常进行try catch会覆盖掉异常过滤器的处理结果。如下图,在使用异常过滤器的控制器中try catch返回结果。
![](http://upload-images.jianshu.io/upload_images/3913171-0b78719c54f474ec.jpg)
![](http://upload-images.jianshu.io/upload_images/3913171-7e73eccf3192c10c.jpg)
3.模型绑定
这是最常见也是最偷懒的地方,如果不使用过滤器,你控制器可能是如下图:
![](http://upload-images.jianshu.io/upload_images/3913171-fd5141e960f97ae8.jpg)
而现在结合模型验证可以将逻辑转移到视图模型里面:
![](http://upload-images.jianshu.io/upload_images/3913171-6fb7e2d1938c48a7.jpg)
而原来的过滤器就会瘦身:
![](http://upload-images.jianshu.io/upload_images/3913171-39d478794b1f5282.jpg)
由于模型验证是比较常用和具有普适性的,所以我在这里使用如下的全局过滤器(避免Startup膨胀,使用扩展方法):
![](http://upload-images.jianshu.io/upload_images/3913171-e2c4195eb1850179.jpg)
![](http://upload-images.jianshu.io/upload_images/3913171-f880cb7d76abdc88.jpg)
这样偷懒的结果也如预期:
![](http://upload-images.jianshu.io/upload_images/3913171-f851a36588e575ed.jpg)
![](http://upload-images.jianshu.io/upload_images/3913171-01bce3eb357c09b1.jpg)
本文采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议
转载请注明:作者 张很水
![](http://upload-images.jianshu.io/upload_images/3913171-a7604d76be28e943.png)