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 ...
随机推荐
- jmeter json乱码
0 环境 系统环境:win7 1 操作 1 找到jmeter.properties 找到jmeter下的bin目录jmeter.properties文件 例如apache-jmeter-\bin\jm ...
- 渗透利器-BadUSB 控制外网主机详解 Teensy2.0++
准备工作 一块 Teensy2.0++ 的板子(淘宝一搜就有) Arduino编译器 1.8.7版本下载连接:arduino下载地址 Teensy插件 下载连接:Teensy下载地址 [外链图片转存失 ...
- python常用包
今日所得 collections模块 时间模块 random模块 os模块 sys模块 序列化模块 subprocess模块 collections模块 namedtuple:具名元组 #定义方式一: ...
- Java IO: InputStreamReader和OutputStreamWriter
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍InputStreamReader和OutputStreamWriter.细心的读者可 ...
- Java开发面试常见问题合集
次面试事故 面试官:你看过哪些源码?我:都挺熟悉的面试官:对hashMap了解程度怎么样?面试官:那你能讲讲 HashMap的实现原理吗?面试官:HashMap什么时候会进行 rehash?面试官:结 ...
- C语言学习笔记之动态分配数组空间
本文为原创文章,转载请标明出处 高级语言写多了,再拿起C语言的时候,自己已经傻了... C语言中数组大小不能为变量,即使这个变量已经被赋过值了,应该使用malloc方法进行数组空间动态分配. 如下: ...
- 配置Oracle10g即时客户端plsql的配置
看到网上有好多的Oracle客户端精简版本,但是这些都不是出自Oracle官方之手,难免可能会出现一些问题.经过我奋战一个小时终于搞定了这个 Oracle10g即时客户端 的配置了 1.先到Oracl ...
- JSP最终学习笔记
一.jsp基础1.JSP概念 Servlet是j2ee提供的动态资源开发技术,是以java的程序的形式进行开发,在java中书写HTML标签是一件十分头疼的事情,所以人们开发出了JSP,看起来像是HT ...
- Python---1基础介绍
因公司有自动化测试需求,开始自学python,跟着廖雪峰老师的教程,一边学习,一遍记笔记,将学习过程中,遇到的大大小小奇奇怪怪的问题,记录与此. 一.安装 Python是跨平台的,它可以运行在Wind ...
- Linux命令alias - 设置命令的别名
用途说明设置命令的别名.在linux系统中如果命令太长又不符合用户的习惯,那么我们可以为它指定一个别名.虽然可以为命令建立“链接”解决长文件名的问题,但对于带命令行参数的命令,链接就无能为力了.而指定 ...