如何使用ASP.Net Core中的條件中間件?
譯文
【51CTO.com快譯】ASP.Net Core是微軟的一種開(kāi)源跨平臺(tái)框架,具有可擴(kuò)展、精簡(jiǎn)化和模塊化的優(yōu)點(diǎn),可用于構(gòu)建高性能Web應(yīng)用程序。中間件組件可以用在ASP.Net Core請(qǐng)求管道中,定制處理請(qǐng)求和響應(yīng)的方式。
ASP.Net Core中間件組件還可用于檢查、路由或修改流經(jīng)管道的請(qǐng)求和響應(yīng)消息。本文討論了如何用ASP.Net Core中的中間件執(zhí)行一些高級(jí)操作。
創(chuàng)建ASP.Net Core MVC項(xiàng)目
首先,不妨在Visual Studio中創(chuàng)建一個(gè)ASP.Net Core項(xiàng)目。假設(shè)你的系統(tǒng)中已安裝Visual Studio 2017或Visual Studio 2019,按照下列步驟,在Visual Studio中創(chuàng)建一個(gè)新的ASP.Net Core項(xiàng)目。
- 啟動(dòng)Visual Studio IDE。
- 點(diǎn)擊“創(chuàng)建新項(xiàng)目”。
- 在“創(chuàng)建新項(xiàng)目”窗口中,從顯示的模板列表中選擇“ASP.Net Core Web應(yīng)用程序”。
- 點(diǎn)擊“下一步”。
- 在“配置新項(xiàng)目”窗口中,指定新項(xiàng)目的名稱和位置。
- 點(diǎn)擊“創(chuàng)建”。
- 在接下來(lái)顯示的“創(chuàng)建新的ASP.Net Core Web應(yīng)用程序”中,從頂部的下拉列表中選擇.Net Core作為運(yùn)行時(shí)環(huán)境和ASP.Net Core 2.2(或更高版本)。
- 選擇“Web應(yīng)用程序(模型-視圖-控制器)”作為項(xiàng)目模板,創(chuàng)建一個(gè)新的ASP.Net Core應(yīng)用程序。
- 確保“啟用Docker支持”和“針對(duì)HTTPS的配置”復(fù)選框未勾選,因?yàn)槲覀冊(cè)诖颂幉粫?huì)使用那些功能。
- 確保身份驗(yàn)證設(shè)置為“無(wú)身份驗(yàn)證”,因?yàn)槲覀円膊粫?huì)使用身份驗(yàn)證。
- 點(diǎn)擊“創(chuàng)建”。
遵循這些步驟應(yīng)該可以在Visual Studio中創(chuàng)建一個(gè)新的ASP.Net Core項(xiàng)目。我們將在本文的后續(xù)部分中使用該項(xiàng)目。
ASP.Net Core中的Use、Run和Map等方法
Use、Map和Run等方法用于在ASP.Net Core中配置HTTP管道。下面簡(jiǎn)要介紹這每個(gè)方法及用途。
- Use——該方法將執(zhí)行委托(delegate),然后進(jìn)入到管道中的下一步。Use方法還可用于使管道短路。
- Run——該方法將執(zhí)行委托并返回結(jié)果。
- Map——該方法將有條件地執(zhí)行委托并返回結(jié)果。
ASP.Net Core中注冊(cè)中間件
ASP.Net Core中的中間件組件在Startup類的Configure方法中注冊(cè)。Use *擴(kuò)展方法用于注冊(cè)中間件。下面是注冊(cè)中間件組件的語(yǔ)法。
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- app.UseMyCustomMiddleware();
- }
值得一提的是,中間件組件按它們注冊(cè)的順序來(lái)加以執(zhí)行。
ASP.Net Core中的Invoke方法
每個(gè)中間件組件都包含一個(gè)Invoke方法。該方法接受對(duì)HttpContext實(shí)例的引用作為實(shí)參。中間件組件可以在調(diào)用下一個(gè)中間件組件前后執(zhí)行操作。下面是典型的Invoke方法的示例:
- public async Task Invoke(HttpContext context)
- {
- // Write code here that will be executed before the
- // next middleware is called
- await _next.Invoke(context); // call next middleware
- // Write code here that will be executed after the
- //next middleware is called
- }
ASP.Net Core中使HTTP管道分支
Map擴(kuò)展方法(即Map和MapWhen)用于使管道分支。Map用于基于特定的請(qǐng)求路徑來(lái)分支,而MapWhen用于基于特定斷言的結(jié)果來(lái)分支。
下列代碼片段表明了Map方法如何用于使請(qǐng)求管道分支。
- public class Startup
- {
- private static void MapRequestA(IApplicationBuilder app)
- {
- app.Run(async context =>
- {
- await context.Response.WriteAsync("This is MapRequestA");
- });
- }
- private static void MapRequestB(IApplicationBuilder app)
- {
- app.Run(async context =>
- {
- await context.Response.WriteAsync("This is MapRequestB");
- });
- }
- private static void MapRequestC(IApplicationBuilder app)
- {
- app.Run(async context =>
- {
- await context.Response.WriteAsync("This is MapRequestC");
- });
- }
- public void Configure(IApplicationBuilder app)
- {
- app.Map("/mapRequestPathA", MapRequestA);
- app.Map("/mapRequestPathB", MapRequestB);
- app.Map("/mapRequestPathB", MapRequestC);
- app.Run(async context =>
- {
- await context.Response.WriteAsync("Hello World!");
- });
- }
- //Other methods
- }
MapWhen方法接受兩個(gè)參數(shù):
- Func
- 委托操作
你可以在Startup類的Configure方法中使用下列代碼片段,不允許內(nèi)容類型“text/html”。
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
- app.MapWhen(context => context.Request.ContentType.Equals
- ("text/xml", StringComparison.InvariantCultureIgnoreCase),
- (IApplicationBuilder applicationBuilder) =>
- {
- applicationBuilder.Run(async context =>
- {
- await Task.FromResult(context.Response.StatusCode = StatusCodes.Status406NotAcceptable);
- });
- });
- app.UseMvc();
- }
ASP.Net Core中的UseWhen方法
UseWhen方法可用于有條件地執(zhí)行中間件。下列代碼片段表明了如果請(qǐng)求路徑以“/api”開(kāi)頭,UseWhen方法如何用于執(zhí)行中間件組件。
- app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
- {
- applicationBuilder.UseCustomMiddleware();
- });
請(qǐng)注意:與MapWhen不同,UseWhen方法繼續(xù)執(zhí)行后一個(gè)中間件,不管UseWhen斷言是真還是假。不妨通過(guò)示例了解這一點(diǎn)??紤]下面這部分代碼:
- app.UseMiddlewareA();
- app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
- {
- applicationBuilder.UseMiddlewareB();
- });
- app.UseMiddlewareC();
如果中間件沒(méi)有短路,中間件A和C將始終執(zhí)行。只有請(qǐng)求路徑以“/api”開(kāi)關(guān),中間件B才會(huì)執(zhí)行。
在ASP.Net Core中,請(qǐng)求處理管道中有一連串中間件組件。所有請(qǐng)求和響應(yīng)都流經(jīng)該管道。新請(qǐng)求進(jìn)入后,這些中間件組件或處理請(qǐng)求,或?qū)⒄?qǐng)求傳遞到管道中的下一個(gè)組件。想完成更復(fù)雜的請(qǐng)求處理,我們可以使用Map和MapWhen方法使管道分支,使用UseWhen有條件地執(zhí)行中間件。
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】