asp.net mvc core 管道以及拦截器初了解
今天来看一下asp.net core的执行管道。先看下官方说明:

从上图可以抛光,asp.net core的执行顺序是,当收到一个请求后,request请求会先经过已注册的中间件,然后会进入到mvc的拦截器管道:

进入mvc管道后,根据以上顺序执行过滤校正。
OK,根据以上说明下面我们新建一个MVC的演示,将执行方式切换为控台运行:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(config=>
{
Console.WriteLine("execute C");
//config.Filters.Add(new AsyncAuthorizationFilter());
config.Filters.Add(new AuthorizationFilter());
config.Filters.Add(new ResourceFilter());
//config.Filters.Add(new AsyncResourceFilter());
config.Filters.Add(new ActionFilter());
//config.Filters.Add(new AsyncActionFilter());
config.Filters.Add(new ResultFilter());
//config.Filters.Add(new AsyncResultFilter());
config.Filters.Add(new ExceptionFilter());
//config.Filters.Add(new AsyncExceptionFilter());
Console.WriteLine("execute D");
});
services.AddSession(config=> {
Console.WriteLine("execute E");
});
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.Use(async (context, next) =>
{
Console.WriteLine("execute F");
await context.Response.WriteAsync("hello world");
Console.WriteLine("execute G");
});
//app.UseSession();
app.UseEndpoints(endpoints =>
{
Console.WriteLine("execute A");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Console.WriteLine("execute B");
});
}
执行结果:

不多做解释,从从这里我们可以抛光符合官方说明文档。
看完中间件执行顺序,下面我们来了解下mvc拦截器的使用与执行顺序。
根据mvc filter管道执行顺序,我们分别来看下用法:
1)AuthorizationFilter:该拦截器是优先级最高的,当请求进入mvc后,首先会被AuthorizationFilter验证是否有权限访问,无权限则跳出。
同步用法:
public class AuthorizationFilter: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
context.HttpContext.Response.WriteAsync("authorization filter \r");
}
}
异步用法:
public class AsyncAuthorizationFilter: IAsyncAuthorizationFilter
{
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
await context.HttpContext.Response.WriteAsync($"async authorization filter in \r");
}
}
2)ResourceFilter:该拦截器是作为第二道拦截器,
OnResourceExecuting在模型绑定之前运行代码。OnResourceExecuted在管道的其余阶段完成之后运行代码。
同步用法:
public class ResourceFilter: IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
context.HttpContext.Response.WriteAsync($"resource executing\r");
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
context.HttpContext.Response.WriteAsync($"resource executed \r");
}
}
异步用法:
public class AsyncResourceFilter: IAsyncResourceFilter
{
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
await context.HttpContext.Response.WriteAsync($" async resource filter in. \r\n");
await next();
await context.HttpContext.Response.WriteAsync($"async resource filter out. \r\n");
}
}
3)ActionFilter:在调用操作方法之前和之后立即运行代码;可以更改传递到操作中的参数;可以更改从操作返回的结果。
同步用法:
public class ActionFilter: IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
context.HttpContext.Response.WriteAsync($"action executing \r");
} public void OnActionExecuted(ActionExecutedContext context)
{
context.HttpContext.Response.WriteAsync($"action executed . \r");
}
}
异步用法:
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
await context.HttpContext.Response.WriteAsync($"async action execution in. \r\n");
await next();
await context.HttpContext.Response.WriteAsync($"async action execution out. \r\n");
}
4)OnException:在向响应正文写入任何内容之前,对声明处理的异常应用变量策略。
同步用法:
public class ExceptionFilter: IExceptionFilter
{
public void OnException(ExceptionContext context)
{
context.HttpContext.Response.WriteAsync($"exception \r");
}
}
异步用法:
public class AsyncExceptionFilter: IAsyncExceptionFilter
{
public Task OnExceptionAsync(ExceptionContext context)
{
context.HttpContext.Response.WriteAsync($"exception async \r");
return Task.CompletedTask;
}
}
5)ResultFilter:在执行操作结果之前和之后立即运行代码;仅当操作方法成功执行时,其才会运行。 可以设置格式化返回结果:
同步操作:
public class ResultFilter: IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{
context.HttpContext.Response.WriteAsync($"result executing\r");
}
public void OnResultExecuted(ResultExecutedContext context)
{
context.HttpContext.Response.WriteAsync($"result executed \r");
}
}
异步用法:
public class AsyncResultFilter: IAsyncResultFilter
{
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
await context.HttpContext.Response.WriteAsync($"result execution async in \r");
await next();
await context.HttpContext.Response.WriteAsync($"result execution async out. \r");
}
}
注册方式我们就是用分区注册,已经在上面说明,不再多做表述,下面我们看下运行情况(页面输出):

定义一个异常看下结果:
public IActionResult Privacy()
{
throw new Exception("error");
}

ok,目标达成,不多说了,下次再看拦截器具体实现。
参考文档:ASP.NET Core 中的筛选器
原创,转载注明出处。

asp.net mvc core 管道以及拦截器初了解的更多相关文章
- 基于Bootstrap和Knockout.js的ASP.NET MVC开发实战 关于 拦截器的 学习 部分
先贴一段: 下面贴代码: 上面这段代码呢,有几个点迷糊.可以找找看
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...
- Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容
Asp.Net MVC 页面代码压缩筛选器 首先定义以下筛选器,用于代码压缩. /*页面压缩 筛选器*/ public class WhiteSpaceFilter : Stream { privat ...
- .NET CORE学习笔记系列(1)——ASP.NET MVC Core 介绍和项目解读
ASP.NET MVC Core 项目文件夹解读 一.项目文件夹总览 1.1.Properties——launchSettings.json 启动配置文件,你可以在项目中“Properties”文件夹 ...
- ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET 5.0 将改名为 ASP.NET Core 1.0 ASP.NET MVC 6 将改名为 ASP.NET MVC Core 1.0 Entity Framework 7.0 将 ...
- [转帖]2016年时的新闻:ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET Core 1.0.ASP.NET MVC Core 1.0和Entity Framework Core 1.0 http://www.cnblogs.com/webapi/p/5673 ...
随机推荐
- fcntl()函数之非阻塞模型
优点:设置标准输入为非阻塞(有数据则读 没有数据则立即返回),常用于网络通信以及轻量信息多并发中 步骤: 1.oldflag=fcntl(STDIN_FILENO,F_GETFL); 获取标准输入的文 ...
- 75)PHP,session在使用时的一些语法问题
(1)cookie仅能存字符串类型,但是session能存任何数据类型,比如: 然后我在session_2.php中输出这个session_1.php的数据: 结果展示: 我得在浏览器的地址栏中先请求 ...
- nginx负载均衡如何实现
什么是nginx?Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的Web和反向代理服务器,也是一个 IMAP/POP3/SMTP ...
- python-django框架-电商项目-首页开发_20191122
python-django框架-电商项目-首页开发 业务背景: 用户浏览网站一定是先到首页, 没有登陆的话首页内容完全一样,而且是不经常变化的, 一段时间内,有100用户访问,就要有几个用户就要查询多 ...
- 3dmax2019卸载/安装失败/如何彻底卸载清除干净3dmax2019注册表和文件的方法
3dmax2019提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dmax2019失败提示3dmax2019安装未完成,某些产品无法安装,也有时候想重新安装3 ...
- Mysql存储过程简单应用
因为很久没写过存储过程了,语法也不记得了,靠百度后,解决了当前问题,这里就简单记录一下. CREATE PROCEDURE pro1() BEGIN DECLARE i int; DECLARE db ...
- iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码
iOS精选源码 iOS WKWebView的使用源码 模仿apple music 小播放器的交互实现 高仿微信的悬浮小窗口 iOS仿支付宝首页效果 [swift]仿微信悬浮窗 类似于今日头条,网易新闻 ...
- jQuery中的bind(), live(), on(), delegate()
当我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 准备知识: 当我们在开始的时候,有些知识是必须具备的: D ...
- SSM 生成mapper中xml文件:未能解析映射资源:“文件嵌套异常
错误日记我就网上随便找个贴着: 错误一: org.springframework.beans.factory.BeanCreationException: Error creating bean wi ...
- fastDFS 一二事 - 简易服务器搭建之--阿里云
第一步:安装fastDFS依赖libevent工具包 yum -y install libevent 第二步:解压libfastcommon-1.0.7.tar.gz文件 tar -zvxf libf ...