asp.net mvc core管道及攔截器的理解
今天來看一下asp.net core的執(zhí)行管道。先看下官方說明:

從上圖可以拋光,asp.net core的執(zhí)行順序是,當(dāng)收到一個(gè)請(qǐng)求后,request請(qǐng)求會(huì)先經(jīng)過已注冊(cè)的中間件,然后會(huì)進(jìn)入到mvc的攔截器管道:

進(jìn)入mvc管道后,根據(jù)以上順序執(zhí)行過濾校正。
OK,根據(jù)以上說明下面我們新建一個(gè)MVC的演示,將執(zhí)行方式切換為控臺(tái)運(yùn)行:
// 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");
});
}
執(zhí)行結(jié)果:

不多做解釋,從從這里我們可以拋光符合官方說明文檔。
看完中間件執(zhí)行順序,下面我們來了解下mvc攔截器的使用與執(zhí)行順序。
根據(jù)mvc filter管道執(zhí)行順序,我們分別來看下用法:
1)AuthorizationFilter:該攔截器是優(yōu)先級(jí)最高的,當(dāng)請(qǐng)求進(jìn)入mvc后,首先會(huì)被AuthorizationFilter驗(yàn)證是否有權(quán)限訪問,無權(quán)限則跳出。
同步用法:
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在模型綁定之前運(yùn)行代碼。OnResourceExecuted在管道的其余階段完成之后運(yùn)行代碼。
同步用法:
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:在調(diào)用操作方法之前和之后立即運(yùn)行代碼;可以更改傳遞到操作中的參數(shù);可以更改從操作返回的結(jié)果。
同步用法:
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:在向響應(yīng)正文寫入任何內(nèi)容之前,對(duì)聲明處理的異常應(yīng)用變量策略。
同步用法:
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:在執(zhí)行操作結(jié)果之前和之后立即運(yùn)行代碼;僅當(dāng)操作方法成功執(zhí)行時(shí),其才會(huì)運(yùn)行。 可以設(shè)置格式化返回結(jié)果:
同步操作:
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");
}
}
注冊(cè)方式我們就是用分區(qū)注冊(cè),已經(jīng)在上面說明,不再多做表述,下面我們看下運(yùn)行情況(頁面輸出):

定義一個(gè)異常看下結(jié)果:
public IActionResult Privacy()
{
throw new Exception("error");
}

ok,目標(biāo)達(dá)成,不多說了,下次再看攔截器具體實(shí)現(xiàn)。
參考文檔:ASP.NET Core 中的篩選器
總結(jié)
到此這篇關(guān)于asp.net mvc core管道及攔截器的文章就介紹到這了,更多相關(guān)asp.net mvc core管道及攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ASP.Net Core MVC基礎(chǔ)系列之中間件
- ASP.Net Core MVC基礎(chǔ)系列之服務(wù)注冊(cè)和管道
- ASP.Net?Core?MVC基礎(chǔ)系列之獲取配置信息
- ASP.Net?Core?MVC基礎(chǔ)系列之項(xiàng)目創(chuàng)建
- ASP.NET Core MVC學(xué)習(xí)之視圖組件(View Component)
- ASP.NET Core MVC基礎(chǔ)學(xué)習(xí)之局部視圖(Partial Views)
- ASP.NET Core MVC學(xué)習(xí)教程之路由(Routing)
- ASP.NET Core MVC/WebApi基礎(chǔ)系列2
- ASP.NET Core MVC/WebApi基礎(chǔ)系列1
- ASP.Net?Core?MVC基礎(chǔ)系列之環(huán)境設(shè)置
相關(guān)文章
Springboot服務(wù)Docker化自動(dòng)部署的實(shí)現(xiàn)方法
這篇文章主要介紹了Springboot服務(wù)Docker化自動(dòng)部署的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
.NET運(yùn)行界面上,實(shí)現(xiàn)隨意拖動(dòng)控件的方法
.NET運(yùn)行界面上,實(shí)現(xiàn)隨意拖動(dòng)控件的方法,需要的朋友可以參考一下2013-03-03
Asp.net SignalR應(yīng)用并實(shí)現(xiàn)群聊功能
這篇文章主要為大家分享了Asp.net SignalR應(yīng)用并實(shí)現(xiàn)群聊功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
asp.net System.Net.Mail 發(fā)送郵件
一個(gè)師弟發(fā)了段代碼給我,說調(diào)試了很久發(fā)送郵件都沒有成功。自己使用過程中,也發(fā)現(xiàn)了很多問題,但最簡(jiǎn)單的問題是“發(fā)件方”地址根本不支持smtp發(fā)送郵件。2009-04-04
ASP.NET Core 3框架揭秘之 異步線程無法使用IServiceProvider問題
這篇文章主要介紹了ASP.NET Core 3框架揭秘之異步線程無法使用IServiceProvider問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
.Net Core中使用Autofac替換自帶的DI容器的示例
Autofac比Core中自帶的DI功能強(qiáng)大的多,比如:屬性注入、基于名稱注入、子容器、自定生存期管理、遲緩初始化,本文就詳細(xì)的來介紹一下.Net Core Autofac替換DI容器,感興趣的可以了解一下2021-06-06
asp.net 票據(jù)簡(jiǎn)單應(yīng)用
asp.net票據(jù)應(yīng)用實(shí)例代碼。2009-03-03

