<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          學(xué)習(xí)ASP.NET Core,中間件這些知識點必須要知道!

          共 4805字,需瀏覽 10分鐘

           ·

          2021-03-03 21:58


          轉(zhuǎn)自:Eric zhou
          cnblogs.com/tianqing/p/12633780.html

          前言


          我們將原有ASP.NET應(yīng)用升級到ASP.NET Core的過程中,會遇到一個新的概念:中間件。


          中間件是ASP.NET Core全新引入的概念。中間件是一種裝配到應(yīng)用管道中以處理請求和響應(yīng)的軟件。每個組件:


          • 選擇是否將請求傳遞到管道中的下一個組件。


          • 可在管道中的下一個組件前后執(zhí)行工作。


          單獨看以上中間件的定義,一個很直觀的感覺:中間件是HTTP請求管道中的一層層的AOP擴展。


          在展開介紹中間件之前,我們先回顧一下ASP.NET中HttpHandler和HttpModule的處理方式。


          一、ASP.NET中HttpHandler和HttpModule


          先看一張圖:



          上圖中有兩個概念HttpHandler和HttpModule,其中:


          HttpHandler用于處理具有給定文件名或擴展名的請求。比如上圖中的.report類的請求,同時,任何一個HttpHandler都需要實現(xiàn)接口IHttpHandler,都需要在Web.Config配置文件中注冊使用。


          HttpModule用于處理每個請求調(diào)用,比如上圖中的Authorization Module,每個Http請求都會經(jīng)過HttpModule的處理。通過HttpModule可以中斷Http請求,可以自定義HttpResponse返回。同時,任何一個HttpModule都需要實現(xiàn)接口IHttpModule,都需要在Web.Config配置文件中注冊使用。


          ASP.NET Core引入了中間件來實現(xiàn)上面2種Http請求處理擴展。ASP.NET Core中間件和ASP.NET HttpHandler HttpModule有什么區(qū)別?


          二、ASP.NET Core中間件和ASP.NET HttpHandler HttpModule的區(qū)別


          1、中間件比HttpHandler、HttpModule更簡單


          • "模塊"、"處理程序"、" Global.asax.cs"、 "WEB.CONFIG" (IIS配置除外)和 "應(yīng)用程序生命周期" 消失


          • 中間件已使用HttpHandler HttpModule的角色


          • 中間件使用代碼而不是在 web.config 中進行配置


          • 通過管道分支,可以將請求發(fā)送到特定的中間件,不僅可以基于 URL,還可以發(fā)送到請求標(biāo)頭、查詢字符串等。


          2、中間件類似于HttpModule     


          • 處理每個請求調(diào)用


          • 可以實現(xiàn)Http請求中間和繼續(xù)


          • 能夠創(chuàng)建自定義的HttpResponse


          3、中間件和HttpModule按不同的順序處理


          • 中間件的順序取決于它們插入請求管道的順序,而模塊的順序主要基于應(yīng)用程序生命周期事件


          • 中間件中Http響應(yīng)的順序與Http請求的順序相反,而對于HttpModule,請求和響應(yīng)的順序是相同的。



          三、ASP.NET Core中間件的設(shè)計原理


          ASP.NET Core 請求管道包含一系列請求委托,依次調(diào)用。下圖演示了這一概念。沿黑色箭頭執(zhí)行。



          每個請求委托(中間件)都可以在下一個請求委托(中間件)之前和之后執(zhí)行操作。中間件中的異常處理委托應(yīng)該在管道的早期被處理,這樣就可以捕獲在管道后期發(fā)生的異常。


          在Startup.Configure 方法中添加中間件組件的順序定義了針對請求調(diào)用這些中間件的順序,以及響應(yīng)的相反順序。這個順序?qū)τ诎踩?、性能和功能非常重要?/span>


          看一段示例代碼:


          public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
          {
          if (env.IsDevelopment())
          {
          app.UseDeveloperExceptionPage();
          app.UseDatabaseErrorPage();
          }
          else
          {
          app.UseExceptionHandler("/Error");
          app.UseHsts();
          }
          app.UseHttpsRedirection();
          app.UseStaticFiles();

          //app.UseCookiePolicy();
          app.UseRouting();
          // app.UseRequestLocalization();
          // app.UseCors();
          app.UseAuthentication();
          app.UseAuthorization();
          //app.UseSession();
          app.UseEndpoints(endpoints =>
          {
          endpoints.MapRazorPages();
          endpoints.MapControllerRoute(
          name: "default",
          pattern: "{controller=Home}/{action=Index}/{id?}");
          });
          }


          上述代碼中每個中間件擴展方法都通過 Microsoft.AspNetCore.Builder 命名空間在 IApplicationBuilder 上公開。


          app.Use***都是各種常用的內(nèi)置中間件。比如:


          1、異常處理類中間件。如上述代碼中:


          當(dāng)應(yīng)用在開發(fā)環(huán)境中運行時:異常顯示頁中間件 (UseDeveloperExceptionPage) 報告應(yīng)用運行時錯誤。數(shù)據(jù)庫錯誤頁中間件報告數(shù)據(jù)庫運行時錯誤。(app.UseDatabaseErrorPage();)


          當(dāng)應(yīng)用在生產(chǎn)環(huán)境中運行時:異常處理程序中間件 (UseExceptionHandler) 捕獲以下中間件中引發(fā)的異常。TTP 嚴格傳輸安全協(xié)議 (HSTS) 中間件 (UseHsts) 添加 Strict-Transport-Security 標(biāo)頭。


          2、HTTPS 重定向中間件 (UseHttpsRedirection) 將 HTTP 請求重定向到 HTTPS。


          3、靜態(tài)文件中間件 (UseStaticFiles) 返回靜態(tài)文件,并簡化進一步請求處理。


          4、Cookie 策略中間件 (UseCookiePolicy) 使應(yīng)用符合歐盟一般數(shù)據(jù)保護條例 (GDPR) 規(guī)定。


          5、用于路由請求的路由中間件 (UseRouting)。


          6、身份驗證中間件 (UseAuthentication) 嘗試對用戶進行身份驗證,然后才會允許用戶訪問安全資源。


          7、用于授權(quán)用戶訪問安全資源的授權(quán)中間件 (UseAuthorization)。


          8、會話中間件 (UseSession) 建立和維護會話狀態(tài)。如果應(yīng)用使用會話狀態(tài),請在 Cookie 策略中間件之后和 MVC 中間件之前調(diào)用會話中間件。


          9、用于將 Razor Pages 終結(jié)點添加到請求管道的終結(jié)點路由中間件(帶有 MapRazorPages 的 UseEndpoints)。


          10、對于單頁應(yīng)用程序 (SPA),SPA 中間件 UseSpaStaticFiles 通常是中間件管道中的最后一個。SPA 中間件處于最后的作用是:允許所有其他中間件首先響應(yīng)匹配的請求。允許具有客戶端側(cè)路由的 SPA 針對服務(wù)器應(yīng)用無法識別的所有路由運行。


          還有很多其他的內(nèi)置中間件,可以參考鏈接:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0。如下圖,



          了解了ASP.NET Core內(nèi)置的中間件之后,我們可能需要自定義一些中間件,比如說原有的ASP.NET HttpModule和HttpHandler.


          接下來第四部分,我們繼續(xù)示例


          四、自定義中間件


          將已有HttpModule用自定義中間件實現(xiàn)


          先看一下原有HttpModule的一個實現(xiàn):


          /// <summary>
          /// 自定義HTTP擴展模塊
          /// </summary>
          public class CustomerHttpModule : IHttpModule
          {
          public void Init(HttpApplication context)
          {
          context.BeginRequest += Context_BeginRequest;
          }
          private void Context_BeginRequest(object sender, EventArgs e)
          {
          HttpApplication app = (HttpApplication)sender;
          // Do something
          }
          public void Dispose()
          {
          }
          }


          遷移到中間件實現(xiàn):


          /// <summary>
          /// 自定義中間件
          /// </summary>
          public class CustomerMiddleware
          {
          private readonly RequestDelegate _next;
          public CustomerMiddleware(RequestDelegate next)
          {
          _next = next;
          }
          public async Task Invoke(HttpContext context)
          {
          // Do something with context near the beginning of request processing.
          await _next.Invoke(context);
          // Clean up.
          }
          }


          同時增加IApplicationBuilder的一個擴展方法:


          public static IApplicationBuilder
          UseCustomerMiddleware(this IApplicationBuilder builder)
          {
          return builder.UseMiddleware<CustomerMiddleware>();
          }


          Startup中使用這個中間件:  

             

          app.UseCustomerMiddlewares();


          以上是對ASP.NET Core中中間件的技術(shù)由來整理和使用分享。








          回復(fù) 【關(guān)閉】學(xué)關(guān)
          回復(fù) 【實戰(zhàn)】獲取20套實戰(zhàn)源碼
          回復(fù) 【被刪】學(xué)
          回復(fù) 【訪客】學(xué)
          回復(fù) 【小程序】學(xué)獲取15套【入門+實戰(zhàn)+賺錢】小程序源碼
          回復(fù) 【python】學(xué)微獲取全套0基礎(chǔ)Python知識手冊
          回復(fù) 【2019】獲取2019 .NET 開發(fā)者峰會資料PPT
          回復(fù) 【加群】加入dotnet微信交流群

          副業(yè)剛需:在Github上也能年入百萬?


          剛剛 .NET 6 Preview 1 終于發(fā)布了!



          瀏覽 112
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  骚逼一级好看毛片 | 无套中出丰满人妻无码99 | 又紧又嫩又爽无遮挡免费 | 一区二区三区另类一级 | 中文字幕日本欧美 |