ASP.NET Core MVC 中的 Filters 允许我们在 请求处理管道 中的某一个阶段的之前和之后执行自定义代码,不同类型的 filter 对应着 请求处理管道 的不同阶段,比如说:ActionFilter 可以在 Action 方法的之前或者之后执行自定义代码,这篇文章我们就来讨论 ASP.NET Core MVC 中内建的 ActionFilter,为什么它非常有用以及在程序中如何使用它。

Filter 过滤器

其实在 ASP.NET Core MVC 中有很多的内建 filter,大体罗列如下:

  • ActionFilters

它会在 Action 方法的执行前和执行后 执行。

  • AuthorizationFilters

它会在 请求处理管道 的开始处被执行,主要用来获取用户的 凭证信息 来验证用户是否被授权。

  • ResourceFilters

它会在 authorization 之后 和 模型绑定 之前被执行,可以利用它实现一些缓存逻辑。

  • ExceptionFilters

它会捕捉到 请求处理管道 中的所有异常,所以可用它来实现一些自定义的异常处理。

到底用哪一种类型的 filter,还是取决于你到底想实现什么业务,举个例子,如果你想 短路 request,提前结束 pipeline 管道返回结果,是不是就可以用 ResourceFilters 哈,再举一个例子,如果你想修改 Action 的入参 并且想对 Action 的结果进行修改,那么 ActionFilter 就是你的最佳选择。

ASP.NET Core MVC 中有一个特性叫 ActionFilterAttribute,它实现了如下接口 IActionFilter, IAsyncActionFilter, IResultFilter, IAsyncResultFilter, IOrderedFilter,可以利用它实现不同层级的Filter,如:Action级,Controller级,全局级,稍后我们将会一一讨论。

创建自定义的 ActionFilter

你可以利用自定义的 ActionFilter 在 Action 方法的前后执行一些可复用的逻辑,或许大家都知道,这就是所谓的 AOP 编程,除了 ActionFilterAttribute ,还有其他几个 Filter 也有类似的 Attribute。

  • ResultFilterAttribute

  • ExceptionFilterAttribute

  • ServiceFilterAttribute

  • TypeFilterAttribute

除了上面这些快捷特性,最简单粗暴的就是实现 IActionFilter 接口 ,还可以实现 同步异步 双模式。

创建同步的 ActionFilter

下面的代码片段展示了如何创建同步模式的 ActionFilter,继承 IActionFilter 接口并实现它的 OnActionExecutingOnActionExecuted 两个方法。

public class SimpleActionFilter : IActionFilter{public void OnActionExecuting(ActionExecutingContext context){//this method will be executed before execution of an action method }public void OnActionExecuted(ActionExecutedContext context){//this method will be executed after an action method has executed }}

创建异步模式的 ActionFilter

下面的代码片段展示了如何创建异步模式的 ActionFilter,继承 IAsyncActionFilter 接口并实现它的 OnActionExecutionAsync 方法。

public class SimpleAsyncActionFilter : IAsyncActionFilter{public async Task OnActionExecutionAsync(ActionExecutingContext context,ActionExecutionDelegate next){//code written here will be executed before execution of an action method await next();//code written here will be executed after execution of an action method }}

配置 ActionFilter

文章之前也说过了,可以将 filter 过滤器 添加到不同级别的作用域中,这些作用域包括:action级, controller级,global级,这里就来演示如何将 filter 添加到 global级 ,仔细观察一下我的 自定义filter 是如何添加到 ConfigureServices 方法下的 filter集合 中,如下代码所示:

public void ConfigureServices(IServiceCollection services){services.AddMvc(options =>{options.Filters.Add(new SimpleAsyncActionFilter());}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);}

除了上面的方法,还可以用 typeof 的方式加入到 options 中,如下代码所示:

public void ConfigureServices(IServiceCollection services){services.AddMvc(options =>{options.Filters.Add(typeof(SimpleAsyncActionFilter));}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);}

总结一下:过滤器允许我们在 请求处理管道 中的某一个点的前后执行一些自定义代码,而且 ActionFilter 还有一个非常大的新改进是可以在 Http 请求管道中指定过滤器的执行顺序,关于更多的 filter 的高级特性,我会在后面的文章中和大家一起分享。

译文链接:https://www.infoworld.com/article/3328648/how-to-use-action-filters-in-aspnet-core-mvc.html

如何在 ASP.NET Core 中使用 ActionFilter相关推荐

  1. 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...

  2. 如何在 ASP.Net Core 中使用 Autofac

    依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...

  3. 如何在 ASP.Net Core 中使用 Lamar

    ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...

  4. 如何在 ASP.Net Core 中使用 MediatR

    MediatR 是一个 中介者模式 的.NET开源实现, 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖,在 中介者模式 中,一个对象不需要直接和另一个对象进行通讯, ...

  5. 如何在 ASP.Net Core 中对接 WCF

    在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三 ...

  6. 如何在 ASP.Net Core 中使用 NCache

    虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式. 内存缓存 分布式缓存 Response缓存 Alachisoft 公司提供了一个开源项目 NCache, ...

  7. 如何在 ASP.Net Core 中使用 Configuration Provider

    ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配 ...

  8. 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...

  9. 如何在 ASP.NET Core 中使用 URL Rewriting 中间件

    URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...

最新文章

  1. 【MATLAB】三维图形绘制 ( 绘制网格 + 等高线 | meshc 函数 | 绘制平面 + 等高线 | surfc 函数 )
  2. 计算机地图制图知识点,地图制图知识点整理
  3. java6 disable ssl2.0_SpringBoot2.0如何启用https协议
  4. 得到一个汉字的拼音第一个字母
  5. ptp精准时间协议_PTP协议时间同步精度测试
  6. 企业shell面试题:获取51CTO博客列表按时间倒序排序
  7. 漫谈C#编程中的多态与new关键字
  8. 熟悉又陌生 彪悍徐茂栋的双面人生
  9. 13.表格标签及其应用实例
  10. 微信 for Mac 3.1.0 测试版发布(附安装包),新增「发朋友圈」功能
  11. Linux 双网卡绑定方法
  12. GT_Trace的使用
  13. Xshell连接centOS7与CentOS7联网——一步到位
  14. 对数坐标归一化_数据归一化处理方法 数据处理之标准化/归一化方法
  15. 互联网产品常用英语单词
  16. 【笔试or面试】美团2014校园招聘
  17. Java集合——数据结构
  18. 基于cocos2dx的2D手游美术资源制作技术选型(1)(2)
  19. 最新版微信 C# 微信HOOK 源代码,微信版本 3.0.0.57
  20. DSP RS232 RS485通信

热门文章

  1. Java研发方向如何准备BAT技术面试答案(上)
  2. .net post xml 数据
  3. 查看端口被占用的进程号然后结束进程(解决端口被进程占用的问题)
  4. 延时消息_Handler的消息延时是怎么实现的
  5. jest忽略如何添加忽略_大多数人忽略的基本家庭维护任务
  6. 详谈如何定制自己的博客园皮肤【转】
  7. Sql Server 优化 SQL 查询:如何写出高性能SQL语句
  8. 对大数据知识架构的梳理
  9. keepalived 原理,安装,配置
  10. 饿了么超级会员,年卡低至108元!饿了么会员,点外卖超省钱!