.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的设计提供了接口规范,同时也降低了客户端与服务 ...
随机推荐
- Intellij IDEA 生成返回值对象快捷键
在编写一行JAVA语句时,有返回值的方法已经决定了返回对象的类型和泛型类型,我们只需要给这个对象起个名字就行. 如果使用快捷键生成这个返回值,我们就可以减少不必要的打字和思考,专注于过程的实现. 步骤 ...
- Oracle 数据库逻辑结构.md
一.存储关系Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据文件组成的:而在逻辑上表空间又是由一个或多个段组成的.在Oracle 数据库中,通过为每种不同的数据对象 ...
- Ethzasl MSF源码阅读(1):程序入口和主题订阅
关于IMU融合知乎上的一篇问答:有哪些开源项目是关于单目+imu做slam的? Ethz的Stephen Weiss的工作,是一个IMU松耦合的方法. 1.程序入口:ethzasl_msf\msf_u ...
- [LeetCode] 系统刷题3_Binary search
可以参考 [LeetCode] questions conclusion_ Binary Search
- 使用new和newInstance()创建类的区别
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一 ...
- utf8 vs utf8mb4
UTF-8 is a variable-length encoding. In the case of UTF-8, this means that storing one code point re ...
- windows将文件夹映射为虚拟磁盘
subst X: e:123 将e盘下的123文件夹映射为x盘,123的容量即x盘容量 subst X: /t 删除映射的x盘
- Session, Token and SSO 有什么区别
Session, Token and SSO 有什么区别 Basic Compareation Session-based Authentication In Session-based Authen ...
- C#串口通信遇到的坑
C#串口通信中有一个DataReceived事件可以委托一个接收函数.此接收函数是运行在辅线程(secondary thread)上的.如果要在这个函数中修改主线程中的一些元素,比如UI界面上的变量的 ...
- Vue用axios跨域访问数据
Vue用axios跨域访问数据axios是vue-resource的替代品,vue-resource不再维护.安装axios:npm install axios使用vue-cli开发时,由于项目本身启 ...