十二个 ASP.NET Core 例子——过滤器
目录:
- 过滤器介绍
- 过滤器类别
- 自定义过滤器和过滤特性
- 直接短路返回内容
- 过滤器与中间件的区别
- 如果要全局日志,不要用过滤器
1.过滤器介绍
没有权限直接返回,资源缓存,Action执行前执行后过滤,异常定制化处理,结果定制化处理 等一些操作都可以用过滤器.而且能省去不少代码
官方解释:ASP.NET Core MVC中的过滤器允许您在请求处理管道中的某些阶段之前或之后运行代码
2.过滤器类别[直接引用官方解释]
每个过滤器类型在过滤器管道中的不同阶段执行。
授权过滤器首先运行,并用于确定当前用户是否被授权用于当前请求。如果请求未经授权,它们可能使管道短路。
资源过滤器是第一个在授权后处理请求的过滤器。他们可以在过滤器管道的其余部分之前运行代码,并在管道的其余部分完成之后运行代码。出于性能原因,它们可用于实现缓存或以其他方式短路过滤器管道。因为它们在模型绑定之前运行,所以它们对于需要影响模型绑定的任何东西都是有用的。
操作过滤器可以在调用单个操作方法之前和之后立即运行代码。它们可用于操作传递到操作中的参数,并从操作返回结果。
异常过滤器用于将全局策略应用于任何事情已写入响应体之前发生的未处理异常。
结果过滤器可以在执行单个操作结果之前和之后立即运行代码。只有当action方法成功执行并且对于必须围绕视图或格式化程序执行的逻辑有用时,它们才会运行
3.自定义过滤器
自定义过滤器两种方式.这里单独用action过滤器介绍
a.继承IActionFilter实现自己的过滤器类,并且在sartUp,mvc服务中注入. 全局都会过滤,在任意一个action执行前和执行后都会过滤一次
IActionFilter继承需要实现两个方法OnActionExecuted,OnActionExecuting,分别是动作执行前和动作执行后
First:自定义过滤器类
public class MyActionFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
var s = "Filter_OnActionExecuted";
} public void OnActionExecuting(ActionExecutingContext context)
{
var s = "Filter_OnActionExecuted";
}
}
Second:注入
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc(options =>
{
options.Filters.Add(new MyActionFilter());
});
}
b.继承Attribute, IActionFilter,通过Attribute特性标识到想要过滤的地方实现局部过滤(controller,action)
First:自定义过滤特性
public class MyActionFilterAttribute : Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
var s = "Attribute_OnActionExecuted";
} public void OnActionExecuting(ActionExecutingContext context)
{
var s = "Attribute_OnActionExecuting";
}
}
Second:标注限制单个action过滤
[MyActionFilter]
public IActionResult Index()
{
return View();
}
Second:标注限制单个controller过滤
[MyActionFilter]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
} public IActionResult About()
{
ViewData["Message"] = "Your application description page."; return View();
} public IActionResult Contact()
{
ViewData["Message"] = "Your contact page."; return View();
} public IActionResult Error()
{
return View();
}
}
注意点:当你实现自定义过滤器注入后,又实现了该类别过滤器的特性.那么执行顺序是全局过滤器OnActionExecuting,再是特性OnActionExecuting,再是特性OnActionExecuted,最后是过滤器OnActionExecuted.
4.直接短路返回内容
public class MyActionFilterAttribute : Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
context.Result = new ContentResult()
{
Content = "Resource unavailable - header should not be set"
};
} public void OnActionExecuting(ActionExecutingContext context)
{
var s = "Attribute_OnActionExecuting";
}
}
只要返回ContentResult就会短路,后面的所有逻辑不会再处理
5.过滤器与中间件的区别
过滤器余中间件非常的像。引用文章地址。区别在于:同作为两个AOP利器,过滤器更贴合业务,它关注于应用程序本身,比如你看ActionFilter 和 ResultFilter,它都直接和你的Action,ActionResult交互了,是不是离你很近的感觉,那我有一些比如对我的输出结果进行格式化啦,对我的请求的ViewModel进行数据验证啦,肯定就是用Filter无疑了。它是MVC的一部分,它可以拦截到你Action上下文的一些信息,而中间件是没有这个能力的。
6.如果要全局日志,不要用过滤器
官方文档中表示。建议不要用过滤器来作为日志记录
原因:避免创建和使用纯粹用于记录目的的过滤器,因为内置的框架记录功能可能已经提供您需要的。如果要将过滤器添加日志记录,则应将注意力集中在特定于过滤器的业务领域问题或行为上,而不是MVC操作或其他框架事件。
十二个 ASP.NET Core 例子——过滤器的更多相关文章
- 十二个 ASP.NET Core 例子
原文地址:http://piotrgankiewicz.com/2017/04/17/asp-net-core-12-samples/ 作者:Piotr Gankiewicz 翻译:杨晓东(Savor ...
- 十二个 ASP.NET Core 例子——中间件
目录: 什么是中间件(IApplicationBuilder) 创建 顺序规则 Asp.Net Core 内置的中间件 1.什么是中间件 官方:中间件是组装成应用程序管道以处理请求和响应的软件.每个组 ...
- 十二个 ASP.NET Core 例子——1.1版本 EF MySql快速搭建
core1.0的时候搭建过一次mysql EF. 一大推问题.最近在core1.1 又重新搭了一次.简单搭建还挺快,没出现什么幺蛾子.总结下步骤 建立项目,例如ASP.NET Core1.1 WebA ...
- 十二个 ASP.NET Core 例子——IOC
目录 简单介绍 core自带IOC的实现解释 1.简单介绍 (个人理解) 是什么:IOC是一种设计原则,而非设计模式,是对流程控制,当你注入你需要的定制化类时,流程就确定了 怎么用:和IOC容器说你这 ...
- 十二个 ASP.NET Core 例子——配置操作
目录: 简单配置(利用configration 键值读取) 使用选项和配置对象(自定义类绑定配置文件实现读取) IOptionsSnapshot(配置文件更改时也变化) 内存数据放到配置对象中 实体框 ...
- 解说asp.net core MVC 过滤器的执行顺序
asp.net core MVC 过滤器会在请求管道的各个阶段触发.同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等.以ActionFilter为例,我们来看看过滤 ...
- ASP.NET Core 使用过滤器移除重复代码
USING ACTIONFILTERS TO REMOVE DUPLICATED CODE ASP.NET Core 的过滤器可以让我们在请求管道的特定状态之前或之后运行一些代码.因此如果我们的 ac ...
- ASP.NET Core MVC 过滤器介绍
过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码. 过滤器如何工作? 过滤器在 MVC Ac ...
- asp.net Core 使用过滤器判断请求客户端是否为移动端,并实现PC端和移动端请求映射和自动跳转
很多时候我们做网站时单纯的用bootstrap等前端框架实现的前端自适应带给用户的体验并不太好,所以为了提高用户体验会专门针对PC端网页重新设计一套移动端网页,但是怎么才能做到在移动端访问PC页面的时 ...
随机推荐
- java多线程(一)-概述
最近这段在看java多线程编程方面的东西.所以特写了几篇文章,来总结和回顾一下自己所学习到的相关知识.因为水平有限,文章中总结不全面甚至理解错误的地方,欢迎读者指点批评. 我们平时所接触到的程序,都是 ...
- 微信小程序之HTTPS请求
1.wx.request wx.request发起的是 HTTPS 请求,以下是它的基本用法,这里不再啰嗦 https://mp.weixin.qq.com/debug/wxadoc/dev/api/ ...
- Linux下查找文件的方法
在Linux环境下查找一个文件的方法:find 路径 -name 'filename',filename不清楚全名的话可以用*号进行匹配,如“tomcat.*”.如果不清楚路径的话可以用"/ ...
- Hibernate学习笔记(1)---hibernate快速上手与准备工作
持久层介绍 持久化:将内存中的数据保存在磁盘等存储设备中. 持久化对象:指已经存储在数据库护着磁盘的业务对象 经典的软件应用体系结构(三层结构) 在三层结构中,由于业务逻辑除了负责业务逻辑以外,还要负 ...
- Mysql查询不为null值
Mysql本以为查询不为null就是!=null可是结果查询出来什么都没有,后来才发现不为null应该是is not null ,为null应该是is null.
- C++拷贝构造函数(深拷贝与浅拷贝)
转自http://blog.csdn.net/lwbeyond/article/details/6202256/ 一. 什么是拷贝构造函数 对于普通类型的对象来说,它们之间的复制是很简单的,例如:in ...
- git删除本地分支
远端master分支有更新需要拉取至本地,但是代码有些地方做了修改导致了小冲突,但是这些修改又是无关紧要的,于是就打算直接删除掉本地分支再重新拉取master分支,过程如下: //查看本地分支 git ...
- jdbc+servlet+jsp实现登录验证
基础知识准备:sql的增删改查. 新增:insert into 表名称(字段名.....)values(字段名....). 修改:update 表名称 set 字段名="新值" ...
- 开blog
开这个blog,现阶段还是主要作为自己的学习笔记 If it could help others, it would be better!
- 请求库-request使用
# -*- coding: utf-8 -*- import requests from urllib.parse import urlencode # python模仿百度搜索引擎 # keywor ...