詳解在ASP.NET Core中如何編寫合格的中間件
這篇文章探討了讓不同的請(qǐng)求去使用不同的中間件,那么我們應(yīng)該如何配置ASP.NET Core中間件?其實(shí)中間件只是在ASP.NET Core中處理Web請(qǐng)求的管道。所有ASP.NET Core應(yīng)用程序至少需要一個(gè)中間件來(lái)響應(yīng)請(qǐng)求,并且您的應(yīng)用程序?qū)嶋H上只是中間件的集合。當(dāng)然MVC管道本身就是中間件,早在WebForm時(shí)代就出現(xiàn)過(guò)HttpModules、HttpHandler、那個(gè)時(shí)候悠然記得我通過(guò)它們來(lái)組織我的廣告系統(tǒng),不閑扯我們繼續(xù)。
每個(gè)中間件組件都有一個(gè)帶有HttpContext參數(shù)的Invoke方法。您可以使用這個(gè)參數(shù)來(lái)處理方法。
public async Task Invoke(HttpContext context) { if (context.Request.Path...) { await context.Response.WriteAsync("writing text..."); } }
應(yīng)用程序中最頂層的中間件將始終針對(duì)每個(gè)請(qǐng)求被調(diào)用。這是由.NET框架自動(dòng)完成的。中間件可以向客戶端發(fā)送響應(yīng),也可以調(diào)用下一個(gè)中間件。對(duì)于后一種選擇,它當(dāng)然需要訪問(wèn)下一個(gè)中間件組件。這就是為什么大多數(shù)中間件組件都是使用帶有RequestDelegate參數(shù)的構(gòu)造函數(shù)定義的??傊?,RequestDelegate會(huì)自動(dòng)填充,您無(wú)需在意。
中間件在Startup.cs的Configure方法中注冊(cè)。Configure方法具有IApplicationBuilder參數(shù),該參數(shù)提供了所有類型的中間件注冊(cè)所需的方法,我們?cè)囍ゾ帉懸粋€(gè)中間件。
public class MyCustomMiddleware { private readonly RequestDelegate _next; public MyCustomMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context, IWebHostEnvironment env) { context.Response.Headers["app-name"] = env.ApplicationName+"Zaranet"; context.Response.Headers["env-name"] = env.EnvironmentName+ "Zaranet"; await _next(context); } }
隨后我們?cè)赟tartup.cs的Configure方法中通過(guò) use 來(lái)注冊(cè)自定義中間件。
public void Configure(IApplicationBuilder app, ...) { app.UseMyCustomMiddleware(); }
啟動(dòng)程序我們發(fā)現(xiàn)一些正常,我們得到了我們想要的效果。
但實(shí)際上,您很少需要直接調(diào)用UseMiddleware,因?yàn)橹虚g件作者的標(biāo)準(zhǔn)方法是編寫特定于所注冊(cè)中間件的擴(kuò)展方法:
using MiddlerWareSolucation.MiddlerWare; using Microsoft.AspNetCore.Builder; namespace MiddlerWareSolucation.MiddlerWare_Extensions { public static class MyCustomMiddlewareExtensions { public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder app) { app.UseMiddleware<MyCustomMiddleware>(); return app; } } }
隨后直接調(diào)用Extensions擴(kuò)展方法,效果還是一樣的。
public void Configure(IApplicationBuilder app, ...) { app.UseMyCustomMiddleware(); }
部分時(shí)候我們想要通過(guò)客戶端請(qǐng)求的路徑來(lái)對(duì)我們的中間件進(jìn)行啟動(dòng),當(dāng)然 MapWhen 允許您通過(guò)指定謂詞將中間件管道分成兩個(gè)完全獨(dú)立的分支:
app.UseMiddlewareOne(); app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => { appBuilder.UseMiddlewareTwo(); }); app.UseMiddlewareThree();
在此示例中,中間件One將始終執(zhí)行,如果請(qǐng)求路徑以“ / api”開(kāi)頭,則將執(zhí)行中間件Two。否則,將執(zhí)行中間件Three。使用這種配置,中間件2和中間件3都無(wú)法針對(duì)單個(gè)請(qǐng)求執(zhí)行。
我想說(shuō)的是最后一種情況是,您希望大多數(shù)中間件針對(duì)所有請(qǐng)求運(yùn)行,但是您有一些條件件-特定中間件僅應(yīng)針對(duì)某些請(qǐng)求運(yùn)行。
這可以通過(guò)UseWhen輕松實(shí)現(xiàn),UseWhen還使用謂詞來(lái)確定中間件是否應(yīng)該運(yùn)行:
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => { appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}"); appBuilder.UseExceptionHandler("/apierror/500"); });
這樣就可以通過(guò)選擇注冊(cè)方式來(lái)自己控制中間件。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.net開(kāi)發(fā)微信公眾平臺(tái)實(shí)例教程
這篇文章主要介紹了.net開(kāi)發(fā)微信公眾平臺(tái)的方法,對(duì)微信公眾平臺(tái)開(kāi)發(fā)的原理與相應(yīng)的.net實(shí)現(xiàn)方法都做了較為詳細(xì)的講述,非常實(shí)用,需要的朋友可以參考下2014-10-10Repeater對(duì)數(shù)據(jù)進(jìn)行格式化處理
最近不止一個(gè)同學(xué),問(wèn)我在Repeater里怎么格式化數(shù)據(jù),怎么處理。因?yàn)镽epeater 屬于服務(wù)器端控件。要么利用本身的控件事件來(lái)處理,要么在數(shù)據(jù)源上處理。2013-03-03asp.net和ajax實(shí)現(xiàn)智能搜索功能代碼
近來(lái)一直在開(kāi)發(fā)股票模擬系統(tǒng),終于告一段落了,回想起來(lái)感慨很多。突然想應(yīng)該做點(diǎn)總結(jié)了,想來(lái)想去還是覺(jué)得通過(guò)寫點(diǎn)日志來(lái)把相關(guān)的知識(shí)點(diǎn)記錄下來(lái),下面就我在項(xiàng)目中經(jīng)常用到的動(dòng)態(tài)提示搜索選項(xiàng)功能的實(shí)現(xiàn)。2010-03-03ASP .NET中執(zhí)行控件(如ImageButton、LinkButton等)命令不刷新頁(yè)面
在操作時(shí),很多時(shí)候希望提交命令之后不刷新頁(yè)面:1、防止頁(yè)面拉動(dòng),2、防止主框架中刷新丟失當(dāng)前運(yùn)行的子界面。2009-03-03Visual Studio 2017 15.5 正式發(fā)布!性能再提升
Visual Studio 2017 15.5 正式發(fā)布!性能再提升,時(shí)發(fā)布的還有 Visual Studio for Mac 7.3,亮點(diǎn)如下2017-12-12ASP.NET?MVC增加一條記錄同時(shí)添加N條集合屬性所對(duì)應(yīng)的個(gè)體
這篇文章介紹了ASP.NET?MVC增加一條記錄同時(shí)添加N條集合屬性所對(duì)應(yīng)個(gè)體的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08C#下載文件(TransmitFile/WriteFile/流方式)實(shí)例介紹
C#下載文件想必很多業(yè)內(nèi)人士都不會(huì)陌生吧,C#下載文件方法很多,本文整理了一些,可供大家參考,感興趣的你可以研究下,或許本文所提供的知識(shí)點(diǎn)對(duì)你有所幫助2013-02-02