ASP.Net Core --过滤器

时间:2020-09-08 03:14:55 来源:

【摘要】 ASP.Net Core --过滤器考必过小编为大家整理了关于ASP.Net Core --过滤器的信息,希望可以帮助到大家!

ASP.Net Core --过滤器

标签:直接exe添加子接口mod路由exceptconfigurenews

Filter

过滤器用于MVC,可以在MVC请求管道里添加逻辑,之前或之后,可以避免代码重复,比如授权,日志,对HTTP有要求等等。

比如:

[Authorize]
pubpc IActionRespt Create()
{
      return View();
}

再比如,需要HTTPS请求:

[RequireHttps]
pubpc IActionRespt Create()
{
    return View();
}

代码也很简洁,直接中括号,写上类名就行

看一下MVC和过滤器的关系:

当请求来到路由器后,可以有一个过滤器,模型验证完后还可以有过滤器,也就是进入controller之前,之后还可以有一个过滤器,ViewRespt执行后也可以有一个过滤器

Filter种类

1:授权:

授权过滤器在过滤器管道中第一个执行,通常用于验证当前请求的合法性,不合法后面的管道会直接跳过。它们只有一个Before方法,不像其它大多数过滤器支持前置阶段方法和后置阶段方法。注意,您不要在授权过滤器中抛出异常,因为没有任何代码来处理异常(异常过滤器不处理它们)。

2:资源

资源过滤器是第二个运行,在 Authorization Filter 之后,Model Binding 之前执行。在性能方面,资源过滤器在实现缓存或截断过滤器管道尤为重要。

3:Action

使用率最高的过滤器,在调用 Acioin 方法之前和之后执行代码。跟 Resource Filter 很类似,但 Model Binding 在之后执行。 &bpl; 异常

4:异常

用于为应用程序执行异常处理策略。

5:Respt

当 Action 执行完成后,最后会执行过滤器。用于处理ActionRespt结果输出策略。

实现Filter

要是有自己定义的Filter,要实现IFilterMetadata这个接口,其实这个接口里边啥也没有,因为它不知道我们需要实现什么功能的Filter,针对以上五种类型,IFilterMetadata一下有五个子接口,分别是:

1:IAuthorizationFilter,IAsyncAuthorizationFilter 注:一个同步版本的还有一个异步版本的

2:IResourceFilter

3:IActionFilter

4:IExceptionFilter

5:IResptFilter

代码示例

新建一个LogResourceFilter.cs文件,如下:

pubpc class LogResourceFilter: Attribute, IResourceFilter
    {
        pubpc void OnResourceExecuting(ResourceExecutingContext context)
        {
            Console.WriteLine("Executing Resource Filter!");
        }

        pubpc void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.Write("Executed Resource Filter...");
        }
    }

里边两个方法,每个方法里都有一个参数,代表上下文,看名字就知道,一个是进行时,一个是过去时或者叫完成时也行。就是一个是在动作发生之前运行,一个是在动作完成后运行

1:ResourceExecutingContext

这个里边包含了HttpContext还有路由的一些东西,以及当前Action的一些信息

2:ResourceExecutedContext

这个和上边的不一样,包含了一些其它方面的东西,比如返回的IActionRespt,具体内容可以对其进行反编译查看源码

这个类实现IResourceFilter这个接口,我们可以对这个接口进行反编译,如下:

可以看到,它就实现了IFilterMetadata这个接口。为什么实现Attribute这个接口?因为要在动作前边使用过滤器

这是同步的,我们再新建一个异步版本的,取名为LogAsyncResourceFilter.cs,如下:

pubpc class LogAsyncResourceFilter : Attribute, IAsyncResourceFilter
    {
        pubpc async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            Console.WriteLine("Executing async Resource Filter!");

            var executedContext = await next();

            Console.WriteLine("Executed async Resource Filter...");

        }
    }

这里边只有一个方法,因为是异步的嘛,有一个委托next,next里就包含了整个剩余的MVC管道里边的东西,在日常开发中,还是使用同步的版本比较好。

应用Filter

一共应用到三个地方

1:Action

2:Controller

3:全局

在Index上边使用LogResourceFilter这个过滤器,代码示例如下:

[LogResourceFilter] 
        pubpc IActionRespt Index() 
        {
            var studentList = _repository.GetAll();

            var newStudentList = studentList.Select(x => new StudentViewModel
            {
                Name = $"{x.FirstName}+{x.LastName}",
                Age = DateTime.Now.Subtract(x.BirthDate).Days / 365,
                Id = x.Id
            });

            var pst = new HomeIndexViewModel
            {
                studentList = newStudentList
            };

            return View(pst);
        }

然后启动项目,打开控制台,如下:

一个index动作发生之前,一个在index动作发生之后。

如果放在Controller之前,那么无论进到那个动作,都会调用这两个方法,这里就不测试了。

全局应用Filter

既然是全局,那么肯定实在startup里添加了,需要在ConfigureServices方法里使用services.AddMvc()来添加

一共有三种方式,如下:

services.AddMvc(options=> 
{
    options.Filters.Add(new LogResourceFilter());

    options.Filters.Add(typeof(LogResourceFilter));

    options.Filters.Add<LogResourceFilter>();
});

这样,不论在那个控制器里,那个动作发生,都会调用过滤器里边那两个方法,一个动作发生之前,一个动作发生之后!

这几种Filter的级别和执行顺序如下:

ASP.Net Core --过滤器

标签:直接exe添加子接口mod路由exceptconfigurenews

以上就是ASP.Net Core --过滤器的内容,更多资讯请及时关注考必过网站,最新消息小编会第一时间发布,大家考试加油!

上一篇      下一篇
前端相关推荐 更多>>
ASP.NET MVC 表单提交多层子级实体集合数据到控制器中 ASP.Net Core 发布后,静态资源访问不了 asp.net core 3.1 自定义中间件实现jwt token认证 asp.net 高级应用 特性Attribute ( 声明,原理,扩展,AOP) Devexpress aspxgridview oncustomcallback 无刷新更新数据 Mataasploit 常见问题 device-aspect-ratio与aspect-ratio单屏布局 wsl 2 unbuntu 部署 asp.net core 使用 nginx 做
前端热点专题 更多>>
热点问答
国家公务员考试年龄限制是多少 公务员国考和省考考试内容有什么区别 函授大专学历能不能考公务员 国家公务员考试考点能自己选择吗 新闻学专业能报考2022年公务员考试吗 什么是联合培养研究生 什么是破格录取研究生 什么人不适合读研 研究生报名户口所在地填什么 研究生结业和毕业有什么区别
网站首页 网站地图 返回顶部
考必过移动版 https://m.kaobiguo.net