当前位置: 首页 > news >正文

html网站模版/优化网站排名

html网站模版,优化网站排名,上海手机网站建设报价表,城乡建设主管部门官方网站ASP.NET Core 系列目录 ASP.NET core 的Filter是系统中经常用到的,本文详细分享一下各种Filter定义、执行的内部机制以及执行顺序。(ASP.NET Core 系列目录) 一、 概述 ASP.NET Core MVC 中有好几种常用的筛选器,例如Authorizatio…

ASP.NET Core 系列目录

ASP.NET core 的Filter是系统中经常用到的,本文详细分享一下各种Filter定义、执行的内部机制以及执行顺序。(ASP.NET Core 系列目录)

一、 概述

ASP.NET Core MVC 中有好几种常用的筛选器,例如Authorization filters 、Resource filters、Action filters 、Exception filters 、Result filters,他们运行在请求处理管道中的特定阶段,例如Authorization filters当前请求的用户是否已授权。 如果请求未获授权,则中止执行后面的请求处理。其他几种filters也类似,只是执行阶段不同。如下图:

              图一

Filter从定义到执行,本文通过四个阶段说明,如下图:

                                                          图二

1.定义:以为例,可以通过继承ActionFilterAttribute并override它的OnActionExecuting和OnActionExecuted方法实现。

2.注册:主要有三种方式:在Startup的AddMvc、Controller、Action中注册。

3.获取:上一章有介绍,在确定了处理请求的Endpoint后,下一步就是创建创建invoker,它有个关键的属性就是filters,它由FilterFactory的GetAllFilters方法获取到。

4.执行:invoker的执行阶段,会进入InvokeFilterPipelineAsync,在这里,各种Filter按照图一的方式逐一被执行。

 

二、Filter的定义

Filter有好几种,但由于本文主要是分享Filter的运行机制,所以只以ActionFilter一种来举例,现在定义一个Test1Filter如下:

复制代码
    public class Test1Filter : ActionFilterAttribute{public override void OnActionExecuting(ActionExecutingContext context){base.OnActionExecuting(context);//do.....}public override void OnActionExecuted(ActionExecutedContext context){base.OnActionExecuted(context);//do......}}
复制代码

很简单,可以很方便的通过继承系统提供的ActionFilterAttribute并override 它的相应方法即可。

 

三、Filter的注册

Filter定义好之后就是将其插入到处理管道中,可以在Startup的AddMvc、Controller、Action中注册。

1.全局:在Startup的AddMvc中注册

services.AddMvc(options => { options.Filters.Add(new Test6Filter()); options.Filters.Add(new Test4Filter()); }
).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

2.只对指定的Controller生效

[Test5Filter]
[Test3Filter]
public class FlyLoloController : Controller

3.只对指定的Action生效

 [Test2Filter][Test1Filter]public JsonResult Index()

在实际业务中,我们可以根据具体的需求来确定Filter的作用范围。

 

四、Filter的获取

Filter的获取是在FilterFactory的GetAllFilters方法中,

复制代码
        public static FilterFactoryResult GetAllFilters(IFilterProvider[] filterProviders,            ActionContext actionContext){//省略……var orderedFilters = actionDescriptor.FilterDescriptors.OrderBy(filter => filter,FilterDescriptorOrderComparer.Comparer).ToList();//省略....return new FilterFactoryResult(staticFilterItems, filters);}
复制代码

 保留了关键的一句话,那就是根据actionDescriptor来获取到它对应的所有Filter(无论是针对全局、Controller还是Action),然后对这些Filter进行排序,这里用到了排序方法FilterDescriptorOrderComparer,它用来定义Filter的执行顺序,详细内容见后文。

 

五、Filter的执行

Filter的执行在invoker的执行阶段,会进入InvokeFilterPipelineAsync,在这里,各种Filter按照图一的方式逐一被执行。具体内容上一章已经进行了详细的描述。它是通过两个while循环实现了如图一的顺序逐一执行。

           while (!isCompleted){await Next(ref next, ref scope, ref state, ref isCompleted);}

具体不再赘述。

 

六、Filter的执行顺序

Filter的执行顺序由三部分决定:

1.对于不同种的Filter,按照图一的顺序执行,例如Authorization filters会最先被执行。

2.对于同种的Filter,执行顺序由其Order和Scope来决定。

在Filter的获取一节提到了Filter的排序方法FilterDescriptorOrderComparer,它拥有对Filter定的排序。

    

复制代码
    public class FilterDescriptorOrderComparer : IComparer<FilterDescriptor>{public static FilterDescriptorOrderComparer Comparer { get; } = new FilterDescriptorOrderComparer();public int Compare(FilterDescriptor x, FilterDescriptor y){if (x == null){throw new ArgumentNullException(nameof(x));}if (y == null){throw new ArgumentNullException(nameof(y));}if (x.Order == y.Order){return x.Scope.CompareTo(y.Scope);}else{return x.Order.CompareTo(y.Order);}}}
复制代码

 

从这个方法可以看到Filter的执行顺序,按照先Order后Scope的方式排序。对于继承默认的内置Filter的,Order默认为0,所有对于这样的Filter来说觉得他们顺序的是Scope,也就是作用域,默认情况下,全局的为10、Controller上的为20、Action上的为30.也就是说,Filter的执行顺序为

全局 -> Controller -> Action, 实际的执行顺序是这样的:

复制代码
全局 OnActionExecutingController OnActionExecutingAction OnActionExecutingAction OnActionExecutedController OnActionExecuted全局 OnActionExecuted
复制代码

也是嵌套的,和中间件的处理方式类似。

当然我们可以自定义Filter的Order使其不再采用默认值0,只需在其构造函数中设置即可

复制代码
    public class Test1Filter : ActionFilterAttribute{public Test1Filter(){Order = 1;}//...........}
复制代码

 

3.对于同样作用域的同种Filter来说,它们的执行顺序是按照注册先后排列的。

例如:

        [Test2Filter][Test1Filter]public JsonResult Index()

则先执行Test2Filter、后执行Test1Filter。

ASP.NET Core 系列目录

 

原文地址:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_18.html

转载于:https://www.cnblogs.com/NetPig/p/10671311.html

http://www.lbrq.cn/news/1600813.html

相关文章:

  • 给传销产品做网站/西安网
  • 武汉网站建设dw027/线上营销
  • 南京每月做社保明细在哪个网站查/1个百度指数代表多少搜索
  • 建筑网建设通网站作用/武汉seo网站优化技巧
  • h5响应式网站开发成本/种子资源
  • 茂名专业网站制作公司/网站权重如何查询
  • 永康网站优化/怎么进行网络推广
  • 有哪个网站可以做口腔执业助理医师题库/网站优化排名查询
  • 做外贸选取哪个网站/厦门人才网官网招聘
  • 对网站建设培训的建议/成都网站搜索排名优化公司
  • 制作婚恋网站/搜索引擎优化介绍
  • 如何在网站做404页面/第三方营销策划公司有哪些
  • 泰安网站开发公司/怎么进行推广
  • 做论坛网站需要备案/全网营销代理加盟
  • 如何查询网站空间/南宁网络优化seo费用
  • 快站建站教程/携程: 2023年旅行搜索上涨超900%
  • 中文网站开发工具/重庆森林在线观看
  • 外贸视频网站/优化设计答案六年级上册
  • 中企动力定制化官网/网站优化排名怎么做
  • 中企动力邮箱/上海短视频seo优化网站
  • 郑州做的比较好网站公司/网站首页seo关键词布局
  • 天河区建设水务局网站/广州抖音推广公司
  • jsp做的简单的图书馆网站/青岛网站建设公司排名
  • 成都住建局官网查询入口/网站seo搜索引擎优化怎么做
  • 用git 做网站/成都seo培训班
  • pc网站转wap网站/成人英语培训班哪个机构好
  • 建站公司服务费包括哪些/seo兼职怎么收费
  • net网站阿里云主机配置/免费网站java源码大全
  • 网站维护更新/营销策略模板
  • 找做模型方案去哪个网站/seo查询排名软件
  • 微帧GPU视频硬编优化引擎:面向人工智能大时代的AI算法与硬编协同优化方案
  • 能表示旋转的矩阵是一个流形吗?
  • 【Unity】背包系统 + 物品管理窗口 (上)
  • leetcode热题——组合
  • Docker 的网络模式
  • Node.js 路由与中间件