.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的设计提供了接口规范,同时也降低了客户端与服务 ...
随机推荐
- pytorch入门与实践-2.2
Tensor 1--本质上可以理解为具有不同维度的数组 2--支持的基本运算 |---创建Tensor: x=t.tensor(x,y) x,y 表示数组的大小 , x=t.rand(x,y), x ...
- vb中的sortedList和java中的
vb中sortedList集合了数组和散列表的特征,可以像数组,ArrayList等索引获取值,也可以像hashtable,hashmap等散列表通过键值对获取值
- Hyper-v带宽限制以及验证工具
最近在做项目的性能测试时,需要模拟网络的带宽来控制文件的上传速度.按照以前的方式方法,我们一般会使用工具 softperfect bandwidth manager 来模拟上下行的带宽. 官网地址 h ...
- HTML 5 拖放 drag dragend dragover ....
拖放(Drag 和 drop)是 HTML5 标准的组成部分. // http://www.w3school.com.cn/html5/html_5_draganddrop.asp dataTrans ...
- Windows 10 Creators Update [ISO官方镜像][15063][1703][x64][x86][创意者更新正式版]
请把下载地址手动复制到迅雷里面去,谢谢! [64 位简体中文专业/家庭版] 文件名:cn_windows_10_multiple_editions_version_1703_updated_march ...
- sourceTree回退撤销commit
https://blog.csdn.net/gang544043963/article/details/71511958
- MacOS High Sierra 引起 VirtualBox Vagrant 同步慢
问题 最近把mac的操作系统升级到了最新版本发现了一个问题,通过共享文件夹的方式 修改的文件,无法立即同步到虚拟机中,大概需要30秒才能同步到共享文件夹. 操作环境如下 虚拟机:Virtualbox ...
- ios dispatch_async使用
一般这样使用: dispatch_async(dispatch_get_global_queue(0, 0),^{ //进入另一个线程 dispatch_async(dispatch_get_main ...
- java框架之Hibernate(4)-几种检索方式
准备 模型及映射文件 package com.zze.bean; import java.util.HashSet; import java.util.Set; public class Class ...
- React之ant design的table表格序号连续自增
render(text,record,index){ return( <span>{(pagination.current-1)*10+index+1}</spa ...