<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>

          ASP.NET Core 中間件

          共 3300字,需瀏覽 7分鐘

           ·

          2020-09-04 15:36

          轉(zhuǎn)自:夢(mèng)里小探花
          cnblogs.com/aoximin/p/13576479.html

          前言


          對(duì)中間件的一個(gè)概況,在《重新整理.net core 計(jì)1400篇》系列后面會(huì)深入。


          正文


          什么是中間件呢?


          其實(shí)中間件這個(gè)概念來(lái)源于分布式,當(dāng)然這是一個(gè)狹隘的概念了,現(xiàn)在中間件概念就非常廣泛了。



          官網(wǎng)給出了這樣一張圖,這張圖認(rèn)為從請(qǐng)求到響應(yīng)過(guò)程中間都是中間件,包括我們認(rèn)為的路由。


          看一段node代碼:


          var http = require("http");
          http.createServer(function(req,res){
          res.writeHead(200,{"Content-type":"text/blain"});
          res.write("Hello NodeJs");
          res.end();
          }).listen(8888);


          沒(méi)有學(xué)過(guò)node 也是ok的,從字面意思就是創(chuàng)建了一個(gè)http服務(wù),然后端口是8888。

          createServer 可以傳入一個(gè)方法,中間有兩個(gè)參數(shù),一個(gè)參數(shù)是req,另一個(gè)參數(shù)就是res。


          其實(shí)就是這么回事,我們寫(xiě)的就是這個(gè)這個(gè)方法里面的代碼,至于,你想拿到req的什么參數(shù),或者給res寫(xiě)入什么信息,這些都是中間件的范疇。


          那么問(wèn)題來(lái)了,問(wèn)什么叫做中間件呢?從語(yǔ)文的層面上理解,那就是分開(kāi)的,一件一件的。


          把這件要執(zhí)行的這些封裝成一個(gè)一個(gè)模塊,那么這些模塊,這些可以通過(guò)調(diào)用next執(zhí)行下一個(gè)模塊,同樣,如果不調(diào)用,那么中間件模塊就會(huì)中斷,因?yàn)橛袝r(shí)候真的需要中斷,比如說(shuō)權(quán)限中間件,


          檢查到權(quán)限不符合直接返回讓其跳轉(zhuǎn)到權(quán)限頁(yè)面,剩下的模塊也用不到。


          • 用 Use 將多個(gè)請(qǐng)求委托鏈接在一起。next 參數(shù)表示管道中的下一個(gè)委托。可通過(guò)不調(diào)用 next 參數(shù)使管道短路。


          • 當(dāng)委托不將請(qǐng)求傳遞給下一個(gè)委托時(shí),它被稱為“讓請(qǐng)求管道短路”。通常需要短路,因?yàn)檫@樣可以避免不必要的工作。


          下圖為ASP.NET Core中默認(rèn)的中間件順序,當(dāng)然可以自己修改,但是這是一種推薦做法。



          挺合理的一個(gè)東西,一開(kāi)始就填入了異常處理機(jī)制。


          然后是強(qiáng)制https 轉(zhuǎn)換->重定向->靜態(tài)資源文件->路由->是否跨域->認(rèn)證->授權(quán)->我們自己自定義需求的。


          因?yàn)檫@個(gè)endpoint 是不建議我們修改的,當(dāng)然我們可以修改源碼中,畢竟開(kāi)源了,but not must。


          官網(wǎng)中同樣給了我們這個(gè)endpoint 做了什么,其實(shí)就是官方自己封裝了一些中間件。



          當(dāng)然我們也可以進(jìn)行對(duì)endpoint自我的調(diào)整,因?yàn)榭赡苁褂貌煌哪0逡?


          app.UseEndpoints(endpoints =>
          {
          endpoints.MapRazorPages();
          endpoints.MapControllerRoute(
          name: "default",
          pattern: "{controller=Home}/{action=Index}/{id?}");
          });


          從上面得到一個(gè)推薦的中間件注冊(cè)來(lái)看,認(rèn)證和授權(quán)在靜態(tài)文件之后,那么我們知道我們的資源時(shí)需要授權(quán)來(lái)保護(hù)的。


          那么如何保護(hù)靜態(tài)資源呢?這后面會(huì)有專門(mén)的一章實(shí)踐一下,看下是什么原理。


          好的,那么看一下我們?nèi)绾巫远x中間件吧,也就是實(shí)踐一下下面這種圖。



          Middleware1


          public class Middleware1
          {
          public readonly RequestDelegate _next;
          public Middleware1(RequestDelegate next)
          {
          _next = next;
          }
          public async Task Invoke(HttpContext context)
          {
          Console.WriteLine("Middleware1");
          await _next(context);
          await context.Response.WriteAsync("Middleware1");
          }
          }



          public class Middleware2
          {
          public readonly RequestDelegate _next;
          public Middleware2(RequestDelegate next)
          {
          _next = next;
          }
          public async Task Invoke(HttpContext context)
          {
          Console.WriteLine("Middleware2");
          await _next(context);
          await context.Response.WriteAsync("Middleware2");
          }
          }


          Middleware3


          public class Middleware3
          {
          public readonly RequestDelegate _next;
          public Middleware3(RequestDelegate next)
          {
          _next = next;
          }
          public async Task Invoke(HttpContext context)
          {
          Console.WriteLine("Middleware3");
          await _next(context);
          await context.Response.WriteAsync("Middleware3");
          }
          }


          擴(kuò)展方法


          public static class Middleware1MiddlewareExtensions
          {
          public static IApplicationBuilder UserMiddleware1(this IApplicationBuilder builder)
          {
          return builder.UseMiddleware();
          }
          public static IApplicationBuilder UserMiddleware2(this IApplicationBuilder builder)
          {
          return builder.UseMiddleware();
          }
          public static IApplicationBuilder UserMiddleware3(this IApplicationBuilder builder)
          {
          return builder.UseMiddleware();
          }
          }


          加入中間件隊(duì)列


          app.UserMiddleware1();
          app.UserMiddleware2();
          app.UserMiddleware3();


          request 順序



          這其實(shí)就是一種職責(zé)鏈模式,每個(gè)中間件確定是否該需求是否要下一級(jí)處理,同樣會(huì)產(chǎn)生一個(gè)處理回調(diào)。

          往期精彩回顧




          【推薦】.NET Core開(kāi)發(fā)實(shí)戰(zhàn)視頻課程?★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門(mén)篇-開(kāi)篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開(kāi)篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了

          10個(gè)小技巧助您寫(xiě)出高性能的ASP.NET Core代碼

          用abp vNext快速開(kāi)發(fā)Quartz.NET定時(shí)任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說(shuō)法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了

          給我好看

          您看此文用

          ??·?

          秒,轉(zhuǎn)發(fā)只需1秒呦~

          好看你就

          點(diǎn)點(diǎn)


          瀏覽 77
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  69亚洲视频 | 日本卖婬片免费看 | 日韩精品18 | 亚洲第一成人网站 | 欧州色爽 |