午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

AspNetCore中的中間件詳解

瀏覽:16日期:2022-06-11 08:28:47
目錄
  • 1 什么叫做中間件?
  • 2 請(qǐng)求短路與中間件順序
  • 3 中間件配置方法Use、Run、Map
    • 3.1Use 方法配置中間件
    • 3.2Run 方法配置中間件
    • 3.2Map 方法配置中間件
  • 4 自定義中間件

    1 什么叫做中間件?

    ASP.NET Core處理請(qǐng)求的方式看做是一個(gè)管道,中間件是組裝到應(yīng)用程序管道中用來(lái)處理請(qǐng)求和響應(yīng)的組件。通常是一個(gè)可重用的類(lèi)方法
    每個(gè)中間件可以:
    (1)選擇是否將請(qǐng)求傳遞給管道中的下一個(gè)組件。
    (2)可以在調(diào)用管道中的下一個(gè)組件之前和之后執(zhí)行業(yè)務(wù)邏輯。

    其中關(guān)于請(qǐng)求管道配置的一個(gè)重要方法在startup中的Configure(IApplicationBuilder app, IWebHostEnvironment env)方法。可用Use、Map、Run方法來(lái)配置需要使用的中間件。通常使用
    IApplicationBuilder的拓展方法來(lái)配置請(qǐng)求管道,加入指定的中間件。

    IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);
    中間件類(lèi)的本質(zhì)其實(shí)是委托類(lèi)

     public void Configure(IApplicationBuilder app, IWebHostEnvironment env){    //判斷是否為開(kāi)發(fā)環(huán)境    if (env.IsDevelopment())    {//使用異常開(kāi)發(fā)頁(yè)面中間件app.UseDeveloperExceptionPage();    }    //靜態(tài)文件中間件    app.UseStaticFiles();    //HTTP請(qǐng)求轉(zhuǎn)HTTPS請(qǐng)求    app.UseHttpsRedirection();    //身份驗(yàn)證    app.UseAuthentication();    //相較于netcore2來(lái)說(shuō),Routing 中間件是拆分出來(lái)的,原來(lái)是屬于MVC中間件的一部分    app.UseRouting();    //端點(diǎn)中間件,請(qǐng)求處理路徑,結(jié)合Routing中間件一起使用的    app.UseEndpoints(endpoints =>    {//當(dāng)請(qǐng)求"/"時(shí),響應(yīng)輸出HelloWorld【可通過(guò)lamda表達(dá)式進(jìn)行配置】endpoints.MapGet("/", async context =>{    await context.Response.WriteAsync("Hello World!");});//請(qǐng)求路徑匹配到 /home/index/1 這種路徑時(shí),將會(huì)到指定的handler處理器上,默認(rèn)會(huì)處理到endpoints.MapControllerRoute("default","/{controller=home}/{action=index}/{id?}");    });}

    2 請(qǐng)求短路與中間件順序

    請(qǐng)求會(huì)按照順序依次經(jīng)過(guò)每個(gè)加入管道的中間件,值得注意的是,中間件可以決定是否將請(qǐng)求交給下一個(gè)委托,當(dāng)中間件拒絕將請(qǐng)求傳遞到下一個(gè)中間件時(shí),叫做請(qǐng)求短路,可以避免不必要的工作。
    中間件的執(zhí)行與調(diào)用的順序有關(guān),在響應(yīng)式以相反的順序返回。請(qǐng)求在每一步都有可能短路,所以需要正確的添加中間件,如異常處理的中間件,需要放在請(qǐng)求管道的前面,這樣就可以一開(kāi)始捕獲異常,以及后面中間件中可能發(fā)生的異常,做出返回處理。

    3 中間件配置方法Use、Run、Map

    ASP.NET 中的核心請(qǐng)求管道是通過(guò)一個(gè)個(gè)請(qǐng)求委托串聯(lián)而來(lái)的,具體是通過(guò)IApplicationBuilder的Use、Run、Map方法來(lái)實(shí)現(xiàn)的。

    在講解中間件配置方法之前,需要了解什么是RequestDelegate、和代碼語(yǔ)言描述的中間件Func<RequestDelegate, RequestDelegate> middleware

        //一個(gè)能處理請(qǐng)求的方法    public delegate Task RequestDelegate(HttpContext context);   //中間件原生定義,委托,輸入是一個(gè)RequestDelegate,輸出也是一個(gè)RequestDelegate,    Func<RequestDelegate, RequestDelegate> middleware = new Func<RequestDelegate, RequestDelegate>((RequestDelegate requestdelegate) =>{    return new RequestDelegate(async (context) =>    {await context.Response.WriteAsync("接收1個(gè)帶RequestDelegate類(lèi)型的參數(shù),返回RequestDelegate類(lèi)型的委托");    });});  // 上述中間件的定義代碼可根據(jù)lamda表達(dá)式規(guī)則進(jìn)行縮寫(xiě)   Func<RequestDelegate, RequestDelegate> middleware = new Func<RequestDelegate, RequestDelegate>((RequestDelegate requestdelegate) =>{    return new RequestDelegate(async (context) =>    {await context.Response.WriteAsync("接收1個(gè)帶RequestDelegate類(lèi)型的參數(shù),返回RequestDelegate類(lèi)型的委托");    });});   Func<RequestDelegate, RequestDelegate> middleware = (request=>{return new RequestDelegate(async (context) =>    {await context.Response.WriteAsync("接收1個(gè)帶RequestDelegate類(lèi)型的參數(shù),返回RequestDelegate類(lèi)型的委托");    });   });

    3.1Use 方法配置中間件

    //增加中間件到請(qǐng)求管道中IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);

    Use 擴(kuò)展可以使用兩個(gè)重載:
    一個(gè)重載采用 HttpContext 和 Func < Task >。 不使用任何參數(shù)調(diào)用 Func< Task >。

         app.Use(async (context, next) =>     {await context.Response.WriteAsync(" Rquest The first middleware");//調(diào)用下一個(gè)中間件await next.Invoke();await context.Response.WriteAsync(" Response The first middleware");    });

    另一個(gè)重載采用 HttpContext 和 RequestDelegate。 通過(guò)傳遞 HttpContext 調(diào)用 RequestDelegate。
    優(yōu)先使用后面的重載,因?yàn)樗∪チ耸褂闷渌剌d時(shí)所需的兩個(gè)內(nèi)部每請(qǐng)求分配。

        app.Use(next =>      {  return new RequestDelegate(async context =>  {     await context.Response.WriteAsync(" Rquest The first middleware");     await next.Invoke(context);     await context.Response.WriteAsync(" Response The first middleware");   });      }   );

    上面兩種方法實(shí)現(xiàn)的功能一致。值得注意的是,next參數(shù)表示管道中的下一個(gè)中間件。通過(guò)不調(diào)用下一個(gè)中間件,會(huì)導(dǎo)致請(qǐng)求短路或中斷,所以需要謹(jǐn)慎的選擇是否需要調(diào)用下一個(gè)中間件。

    3.2Run 方法配置中間件

       public static void Run(this IApplicationBuilder app, RequestDelegate handler);

    Run 方法配置請(qǐng)求管道時(shí),會(huì)使得請(qǐng)求管道短路,因?yàn)樗徽{(diào)用下一個(gè)請(qǐng)求。因此Run方法一般只在管道的底部使用。

      app.Run( async context=> {await context.Response.WriteAsync(" Rquest The final middleware");  });

    3.2Map 方法配置中間件

    //pathMatch 請(qǐng)求路徑匹配字符串//configuration 符合匹配規(guī)則時(shí)采取的 請(qǐng)求處理邏輯.//configuration 是一個(gè)無(wú)返回,請(qǐng)求參數(shù)類(lèi)型為 IApplicationBuilder的回調(diào)函數(shù)。public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action<IApplicationBuilder> configuration);

    Map 方法是一種可以基于請(qǐng)求路徑的不同來(lái)配置分支中間件。

     app.Map("/secondturl", appBuilder => {   appBuilder.Run(async context =>    { await context.Response.WriteAsync(" the request"url is  secondturl" + "\n"); });    });

    且可以在嵌套使用Map方法去配置分支中間件

    4 自定義中間件

    雖然中間件的本質(zhì)是一個(gè)Func<RequestDelegate, RequestDelegate> middleware 對(duì)象,
    中間件的類(lèi)型可分為兩種,下面自定義實(shí)現(xiàn)以及記錄請(qǐng)求IP地址的中間件

    弱類(lèi)型中間件
    (1) 定義Ip中間件

       public class RequestIpMiddleware    {private readonly RequestDelegate requestDelegate;public RequestIpMiddleware(RequestDelegate requestDelegate) {    this.requestDelegate = requestDelegate;}public async Task Invoke(HttpContext context) {    context.Response.WriteAsync("The Request Ip is " + context.Request.HttpContext.Connection.RemoteIpAddress.ToString()+"\n");    //調(diào)用下一個(gè)請(qǐng)求中間件    await requestDelegate.Invoke(context);}    }

    (2)增加Use的拓展方法

        /// <summary>    /// 調(diào)用中間件的擴(kuò)展方法    /// </summary>    public static class MiddlewareExtensions    {/// <summary>///this 關(guān)鍵字不能省略/// </summary>/// <param name="app"></param>/// <returns></returns>public static IApplicationBuilder UseIpMiddleware( this IApplicationBuilder app ) {   return  app.UseMiddleware<RequestIpMiddleware>();}    }

    (3)Configure方法中使用該中間件

         app.UseIpMiddleware();

    強(qiáng)類(lèi)型中間件

    可以在Use方法中調(diào)用這個(gè)匿名內(nèi)部類(lèi),但是最好是將中間件定義成一個(gè)強(qiáng)類(lèi)型,利于閱讀,且符合編程習(xí)慣。
    IApplicationBuilder 提供了一種拓展方法來(lái)配置強(qiáng)類(lèi)型的中間件

    public static IApplicationBuilder UseMiddleware<TMiddleware>(this IApplicationBuilder app, params object[] args);
        /// <summary>    /// 自定義中間件     /// </summary>    public class IPMiddleware : IMiddleware    {/// <summary>/// IMiddleware接口定義了唯一的InvokeAsync方法,用來(lái)實(shí)現(xiàn)對(duì)請(qǐng)求的處理。/// </summary>/// <param name="context"> 當(dāng)前請(qǐng)求上下文</param>/// <param name="next">下一個(gè)請(qǐng)求requestDelegate</param>/// <returns></returns>public Task InvokeAsync(HttpContext context, RequestDelegate next){    //獲取請(qǐng)求的IP    var ip = context.Request.HttpContext.Connection.RemoteIpAddress.ToString();    context.Response.WriteAsync("IP is "+ip+"\n");    //調(diào)用下一個(gè)中間件    return  next.Invoke(context);}    }

    值得注意的是在使用這個(gè)中間件時(shí),需要將當(dāng)前中間件注入到容器中,否則請(qǐng)求管道中的這個(gè)中間件無(wú)法生效。

    到此這篇關(guān)于AspNetCore中的中間件詳解的文章就介紹到這了,更多相關(guān)AspNetCore中間件內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: ASP.NET
    主站蜘蛛池模板: 成人网久久 | 国产激情综合 | 久久精品在线播放 | 成人在线免费观看视频 | 少妇一级淫片免费放中国 | 精品小视频 | 久久男女视频 | 久久三级视频 | 亚洲青草 | 免费视频一二三区 | 精品无人国产偷自产在线 | 久草在在线| 国产精品久久婷婷六月丁香 | www狠狠| 久久国产美女视频 | 午夜精品在线视频 | 国产xxx视频| 精品免费一区二区三区 | 日韩精品视频在线免费观看 | 美日韩中文字幕 | 欧美,日韩,国产精品免费观看 | 一二三区在线观看 | 成人免费毛片嘿嘿连载视频 | 伊人影院久久 | 亚洲色图第一页 | 欧美成人手机在线 | 日韩免费视频一区 | av免费在线观 | 久久午夜精品 | 国产一区在线视频观看 | 亚洲天堂欧美 | av中文字幕免费观看 | 91香蕉国产在线观看软件 | 久精品在线 | 国产流白浆 | 成年人在线观看视频网站 | 精品在线播放视频 | 正在播放久久 | 婷婷6月天| 放几个免费的毛片出来看 | 97久久精品 |