日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

理解ASP.NET Core中的中间件

發布時間:2023/12/4 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解ASP.NET Core中的中间件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

中間件是ASP.NET Core的一個重要特點,ASP.NET Core應用程序之所以能夠靈活地處理各種各樣的請求,完成都是由于中間件,那么它究竟是怎么一回事呢?

一、理解中間件

ASP.NET Core的一個主要特點是中間件(Middleware),它通過中間件來處理傳入的HTTP請求,并將處理結果返回給發起請求的客戶端。多個中間件構成了中間件管道(Middleware pipeline),也稱為請求管道。之所以稱其為管道,是因為請求能夠從一個中間件進入另一個中間件,并以相反的順序再出來,如下圖。

對于一個ASP.NET Core應用程序,所有向它發送的請求,都是通過它里面添加的中間件來進行處理并返回響應,比如顯示網站的首頁、對用戶的認證、請求靜態文件(CSS、JavaScript文件)等等。

另外,需要注意的是,傳入的請求,不一定會遍歷到所有添加的中間件,有可能在經過某一個中間件處理時,直接返回響應,而不再繼續前進,比如,如果用戶沒有通過認證,或者程序出現異常時,就不會再繼續被下一個中間件處理。

二、Program與Startup

在一個ASP.NET Core應用中,最主要的文件有兩個,一個是Program.cs,另一個是Startup.cs,其中Program.cs里包含了程序的入口,即Program類中的Main函數。而Startup.cs文件中的Startup類則是用來配置當前應用程序。

Startup類包含了兩個方法,即ConfigureServices和Configure,其中前者主要是用于向依賴注入容器添加服務,而后者則是用于為當前程序配置處理HTTP請求的請求管道;在這個方法里,我們可以根據需要添加多個中間件。

public class Startup {public void ConfigureServices(IServiceCollection services){// 向依賴注入容器添加服務}public void Configure(IApplicationBuilder app, IHostingEnvironment env){// 配置中間件管道 } }

三、添加中間件

添加中間件的方法有3種,這3種方法都是通過Configure方法的參數IApplicationBuilder接口所提供的方法實現的,這個接口提供Use、Map以及Run方法,均能夠用來添加中間件。

1、Run方法最簡單,它僅處理請求,并不會將請求傳入下一個中間件。因此,對于如下代碼,會直接返回包含一串字符的響應。

app.Run(async (context) =>{ await context.Response.WriteAsync("Hello World!");});

2、Use方法與Run方法不同的是,它在處理請求后,還可以把請求傳遞給下一個中間件,并由其繼續處理。

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {app.Use(async (context, next) =>{if (context.Request.Path.Value == "/welcome"){await context.Response.WriteAsync("Hello World!");}else{Debug.WriteLine("中間件 A 開始");// ....await next();// ...Debug.WriteLine("中間件 A 結束");}});app.Run(async (context) =>{await context.Response.WriteAsync("Hello World!");}); }

以上代碼的運行結果是:顯示“中間件 A 開始” -> 在響應正文中寫入信息 -> 顯示“中間件A結束。
注意:盡管Use方法能夠讓下一個中間件繼續處理請求,它也可以直接處理,不再繼續向前,在上例中如果訪問/welcome將直接返回響應。
3、Map方法允許指定一個條件,如果請求符合該條件,則會新建一個分支,并在該分支上繼承處理請求,而當請求處理結束后,不返回原來的分支。

public void Configure(IApplicationBuilder app) {app.Use(async (context, next) =>{ Console.WriteLine("中間件 A:開始");await next();Console.WriteLine("中間件 A:結束");});app.Map(new PathString("/map"),a => a.Use(async (context, next) =>{Console.WriteLine("中間件 B:開始");await next();Console.WriteLine("中間件 B:結束");}));app.Run(async context =>{Console.WriteLine("中間件 C");await context.Response.WriteAsync("Hello world");}); }

當請求/map后,其結果如下:

中間件 A:開始 中間件 B:開始 中間件 B:結束 中間件 A:結束

可以看到,中間件C并未執行。
事實上,除了以上3個方法,ASP.NET Core還提供了UseWhen和MapWhen這兩個方法,它們能夠以更復雜的方式來添加中間件。

通過上面的介紹,我們可以明白兩點,第一,中間件并不復雜,它本質上就是用于處理HTTP請求的一段代碼;第二點,中間件的添加順序很重要,因為它的添加順序將決定應用程序如何處理HTTP請求。

四、自定義中間件

通過上面的方式添加的中間件,我們可以稱為內聯中間件(Inline Middleware),這種方式在實際開發中很少見,更常見的方式是創建自定義中間件類,也即,添加一個類,通過這個類來代表中間件并實現其功能。而這個類需要滿足兩個條件:

第一,它包含一個帶有RequestDelegate類型參數的構造函數,這個RequestDelegate類型的參數表示在請求管道中的下一個中間件;

第二,它包含一個Invoke方法,該方法接受一個HttpContext類型的參數,并且這個方法的返回值為Task,這個HttpContext類型的參數即表示傳入的HTTP請求。以下是一個典型自定義中間件:

public class CheckRequestPathMiddleware {private RequestDelegate _next;public CheckRequestPathMiddleware(RequestDelegate requestDelegate){this._next = requestDelegate;}public Task Invoke(HttpContext context){if (context.Request.Path.Value == "/about"){context.Response.ContentType = "text/plain;charset=utf-8";context.Response.WriteAsync("Hello, 這條消息由自定義中間件輸出");return Task.CompletedTask;}else{return _next(context);}} }

當中間件創建好之后,要在Startup類中的Configure方法中把它添加到管道中,只要使用IApplicationBuilder接口的UseMiddleware方法。

app.UseMiddleware<CheckRequestPathMiddleware>();

ASP.NET Core提供了很多中間件,它們能夠滿足開發Web應用程序時所需要的各種功能,這些中間件包括:MVC、認證、靜態文件、HTTPS重定向、CORS等。以下代碼顯示了一個標準應用程序所添加的中間件。

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles();app.UseCookiePolicy();app.UseMvc(routes =>{routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");}); }

以上這些以Use開頭的方法均是向請求管道添加相應的中間件。我們可能注意到這些方法并不像我們剛才介紹的添加中間件的方法那樣,即要么使用Use/Map/Run等,要么使用UseMiddleware方法。這里需要說明的是,以上這些以Use開頭的方法本質上也是使用了UseMiddleware方法來添加中間件的。這些方法只不過是通過額外定義的一個擴展方法來更方便地添加相應的中間件而已。我們同樣也可以創建類似的擴展方法,以方便別人使用我們所創建的自定義中間件。

public static class CheckRequestPathMiddlewareExtentions {public static void UseCheckRequestPathMiddleware(this IApplicationBuilder app){app.UseMiddleware<CheckRequestPathMiddleware>();} }

通過上面這個方法,我們就可以在Configure方法中直接調用app.UseCheckRequestPathMiddleware方法來添加這個自定義中間件了。

總結
本文簡要地介紹了ASP.NET Core中所引入的中間件的概念以及其使用方法,中間件極大地方便了應用程序對HTTP請求的處理。多個中間件構成的管道為ASP.NET Core應用程序提供了更靈活的、更輕量的HTTP請求處理方式。

總結

以上是生活随笔為你收集整理的理解ASP.NET Core中的中间件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。