.NET Core 管道过滤器扩展
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
验证是否为开发环境 是就正常报错 否则跳转到错误页
app.UseStaticFiles();
验证当前请求是否存在物理物件 存在直接返回 不走MVC路由
以前的管道模型 根据请求传递的控制器 方法 先实例化控制器 然后在invoke 在invoke中 执行管道中的20来个事件
在.NET Core中 先进入授权验证等一系列操作 成功在实例化控制器等后续操作

扩展过滤器
都需要继承Attribute 接口可以选择继承IActionFilter IResourceFilter IResultFilter
继承IActionFilters的过滤器在管道中的Action Filters环节触发
继承IResultFilter 的过滤器在管道中的IResultFilter 环节触发(自己在application层写的执行完毕后触发)
继承ResourceFilters的过滤器其在管道的ResourceFilters环节触发 (适合做一些短路 比如缓存 这里存在就直接返回 )
三种过滤器执行的前后顺序 ResourceFilters入→IActionFilters入→IActionFilters出→IResultFilter入→IResultFilter出→ResourceFilters出
只有ResourceFilters在数据模型绑定之前 其他的都在数据模型绑定之后 异常处理过滤需要在进入数据模型绑定才出发
这些过滤器的 context.Result就是返回的数据 进入下一环节之前 会进行验证context.Result中的数据是否为null 如果不为null 就直接返回了
局部过来:在方法上直接直接加上过滤器
全局过滤: 往容器中添加过滤器
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// MVC
services.AddMvc(
options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName));
options.Filters.Add(typeof(CustomActionFilterAttribute));
}
);
依赖注入也是在IServiceCollection中实现的
1. 继承IActionFilter过滤器
public class CustomActionFilterAttribute: Attribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine("ActionFilter 之前!");
//logger.Info("ActionFilter Executing!");
}
public void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine("ActionFilter 之后!");
//logger.Info("ActionFilter Executed!");
}
}
2.继承ResourceFilters过滤器
public class CustomResourceFilterAttribute : Attribute, IResourceFilter
{
private static readonly Dictionary<string, object> _Cache = new Dictionary<string, object>();
private string _cacheKey; public void OnResourceExecuting(ResourceExecutingContext context)
{
_cacheKey = context.HttpContext.Request.Path.ToString();
if (_Cache.ContainsKey(_cacheKey))
{
var cachedValue = _Cache[_cacheKey] as ViewResult;
if (cachedValue != null)
{
context.Result = cachedValue;
}
}
} public void OnResourceExecuted(ResourceExecutedContext context)
{
if (!String.IsNullOrEmpty(_cacheKey) &&
!_Cache.ContainsKey(_cacheKey))
{
var result = context.Result as ViewResult;
if (result != null)
{
_Cache.Add(_cacheKey, result);
}
}
}
}
********************************
扩展中间件 Middleware Map适合做一些分发 根据请求条件指定中间件
app.Map("/Jcb",MapTest) 请求到这里就不会继续往后面执行
app.MapWhen() 跟上面的一样 更加灵活 但是都没有回头路 当前中间件就直接结束并返回
UseWhen() 执行里面的后还继续往后面执行中间件
.NET Core 管道过滤器扩展的更多相关文章
- AspectCore.Extension.Reflection : .NET Core反射扩展库
在从零实现AOP的过程中,难免会需要大量反射相关的操作,虽然在.net 4.5+/.net core中反射的性能有了大幅的优化,但为了追求极致性能,自己实现了部分反射的替代方案,包括构造器调用.方法调 ...
- .net core 在扩展中使用接口实例之IServiceProvider
在.net core 2.0中,我们使用的对象实例大多数都是通过构造函数依赖注入进来的,但那是在一般的类中使用. 如果需要在静态/扩展类中使用某些服务类的对象实例,可以使用如下方式: 1.新建一个Se ...
- asp.net core tags 扩展之 id 和 name
asp.net core 页面 TagHelper 的 Id 和 Name 属性扩展 . [HtmlTargetElement(Attributes = "asp-name")] ...
- 使用Asp.Net Core MVC 开发项目实践[第四篇:基于EF Core的扩展2]
上篇我们说到了基于EFCore的基础扩展,这篇我们讲解下基于实体结合拉姆达表达式的自定义更新以及删除数据. 先说下原理:其实通过实体以及拉姆达表达式生成SQL语句去执行 第一种更新扩展: 自定义更新字 ...
- 使用Asp.Net Core MVC 开发项目实践[第三篇:基于EF Core的扩展]
上篇我们说到了EFCore的基础使用,这篇我们将讲解下基于EFCore的扩展. 我们在Mango.Framework.EFCore类库项目中创建一个类名EFExtended的扩展类,并且引入相关的命名 ...
- MySql + EF6 + .Net Core
2016年8月17日01:21:29 更新:这里介绍一下一个开源的 EF Core 的 MySQL 组件 [MySQL for .NET Core - Pomelo 扩展包系列][http://www ...
- Core Animation编程指南
本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原 ...
- ASP.NET Core 2.0 自定义 _ViewStart 和 _ViewImports 的目录位置
在 ASP.NET Core 里扩展 Razor 查找视图目录不是什么新鲜和困难的事情,但 _ViewStart 和 _ViewImports 这2个视图比较特殊,如果想让 Razor 在我们指定的目 ...
- 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持
HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...
随机推荐
- Python 学习笔记1 安装和IDE
前面的话 现在随着互联网的快速发展,对测试人员的代码要求也越来越高.有种逐步往全栈开发人员发展的趋势. 越来越多的手工测试被自动化取代. 对于测试人员,学习一门开发语言迫在眉睫. C#, JAVA, ...
- redis问题与解决思路
问题现象: 集群状态 1主 2从,主没有开启bgsave,从开启bgsave.现象所有redis可以访问,进行操作.主不断开始bgsave 1从停止bgsave. 主日志报错# Connection ...
- python2,python3同时安装时,python3可以安装并升级pip库,python2报错的解决办法
最近在使用pip安装包的的时候出现下面错误 UnicodeEncodeError: 'ascii' codec can't encode character u'\u258f' 查询资料后发现原因是p ...
- ES6 对象
对象字面量 属性的简洁表示法 ES6允许对象的属性直接写变量,这时候属性名是变量名,属性值是变量值. const age = 12; const name = "Amy"; con ...
- Visual Studio 2017使用Asp.Net Core构建Angular4应用程序
文章转载请著名出处:http://www.cnblogs.com/smallprogram 你需要了解的名词 1. NodeJS,这是一个基于Chrome V8 JavaScript引擎构建的Java ...
- SpringMVC整合mybatis基于纯注解配置
Mybatis整合Spring配置 第一部分:配置Spring框架 配置SpringMVC的步骤 配置流程图 导入包(哪些包,基本包5个,1日志依赖包,2webmvc支持包)SpringMVC配置 & ...
- 【Assembly】-NO.88.Assembly.2.滴水逆向.1.002-【位运算及基础指令】-
1.0.0 Summary Tittle:[Assembly]-NO.88.Assembly.2.滴水逆向.1.002-[]- Style:Java Series:Log4j Since:2018-0 ...
- mysql----------mysql5.7.11导入sql文件时报错This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled
1.导入sql文件出现如下错误. [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in ...
- Kubernetes 网络改进的三项实践分享
自研CNI IPAM插件 解决K8s功能问题 首先,在功能方面,Kubernetes 网络模型由于IP不固定,无法对IP资源进行精细管控,无法使用基于IP的监控和基于IP的安全策略,此外,一些IP发现 ...
- Openstack-Namespaces
介绍OpenStack neutron使用Linux网络命名空间来避免物理网络和虚拟网络间的冲突,或者不同虚拟网络间的冲突. 网络命名空间就是一个独立的网络协议栈,它有自己的网络接口,路由,以及防火墙 ...