电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

AspNetCore中的中間件詳解

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

    1 什么叫做中間件?

    ASP.NET Core處理請求的方式看做是一個管道,中間件是組裝到應用程序管道中用來處理請求和響應的組件。通常是一個可重用的類方法
    每個中間件可以:
    (1)選擇是否將請求傳遞給管道中的下一個組件。
    (2)可以在調用管道中的下一個組件之前和之后執行業務邏輯。

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

    IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);
    中間件類的本質其實是委托類

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

    2 請求短路與中間件順序

    請求會按照順序依次經過每個加入管道的中間件,值得注意的是,中間件可以決定是否將請求交給下一個委托,當中間件拒絕將請求傳遞到下一個中間件時,叫做請求短路,可以避免不必要的工作。
    中間件的執行與調用的順序有關,在響應式以相反的順序返回。請求在每一步都有可能短路,所以需要正確的添加中間件,如異常處理的中間件,需要放在請求管道的前面,這樣就可以一開始捕獲異常,以及后面中間件中可能發生的異常,做出返回處理。

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

    ASP.NET 中的核心請求管道是通過一個個請求委托串聯而來的,具體是通過IApplicationBuilder的Use、Run、Map方法來實現的。

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

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

    3.1Use 方法配置中間件

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

    Use 擴展可以使用兩個重載:
    一個重載采用 HttpContext 和 Func < Task >。 不使用任何參數調用 Func< Task >。

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

    另一個重載采用 HttpContext 和 RequestDelegate。 通過傳遞 HttpContext 調用 RequestDelegate。
    優先使用后面的重載,因為它省去了使用其他重載時所需的兩個內部每請求分配。

        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");   });      }   );

    上面兩種方法實現的功能一致。值得注意的是,next參數表示管道中的下一個中間件。通過不調用下一個中間件,會導致請求短路或中斷,所以需要謹慎的選擇是否需要調用下一個中間件。

    3.2Run 方法配置中間件

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

    Run 方法配置請求管道時,會使得請求管道短路,因為它不調用下一個請求。因此Run方法一般只在管道的底部使用。

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

    3.2Map 方法配置中間件

    //pathMatch 請求路徑匹配字符串//configuration 符合匹配規則時采取的 請求處理邏輯.//configuration 是一個無返回,請求參數類型為 IApplicationBuilder的回調函數。public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action<IApplicationBuilder> configuration);

    Map 方法是一種可以基于請求路徑的不同來配置分支中間件。

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

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

    4 自定義中間件

    雖然中間件的本質是一個Func<RequestDelegate, RequestDelegate> middleware 對象,
    中間件的類型可分為兩種,下面自定義實現以及記錄請求IP地址的中間件

    弱類型中間件
    (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");    //調用下一個請求中間件    await requestDelegate.Invoke(context);}    }

    (2)增加Use的拓展方法

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

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

         app.UseIpMiddleware();

    強類型中間件

    可以在Use方法中調用這個匿名內部類,但是最好是將中間件定義成一個強類型,利于閱讀,且符合編程習慣。
    IApplicationBuilder 提供了一種拓展方法來配置強類型的中間件

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

    值得注意的是在使用這個中間件時,需要將當前中間件注入到容器中,否則請求管道中的這個中間件無法生效。

    到此這篇關于AspNetCore中的中間件詳解的文章就介紹到這了,更多相關AspNetCore中間件內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

    標簽: ASP.NET
    主站蜘蛛池模板: 长沙广告公司|长沙广告制作设计|长沙led灯箱招牌制作找望城湖南锦蓝广告装饰工程有限公司 | 天津散热器_天津暖气片_天津安尼威尔散热器制造有限公司 | 间苯二酚,间苯二酚厂家-淄博双和化工 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 江苏大隆凯科技有限公司 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 冷库安装厂家_杭州冷库_保鲜库建设-浙江克冷制冷设备有限公司 | Pos机办理_个人商户免费POS机申请-拉卡拉办理网 | 防火阀、排烟防火阀、电动防火阀产品生产销售商-德州凯亿空调设备有限公司 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 广东青藤环境科技有限公司-水质检测 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | 润滑油加盟_润滑油厂家_润滑油品牌-深圳市沃丹润滑科技有限公司 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 冷却塔改造厂家_不锈钢冷却塔_玻璃钢冷却塔改造维修-广东特菱节能空调设备有限公司 | 闪电优家-卫生间防水补漏_酒店漏水渗水维修_防水堵漏公司 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 广州印刷厂_广州彩印厂-广州艺彩印务有限公司 | 刑事律师_深圳著名刑事辩护律师_王平聚【清华博士|刑法教授】 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 沟盖板_复合沟盖板厂_电力盖板_树脂雨水篦子-淄博拜斯特 | 集菌仪厂家_全封闭_封闭式_智能智能集菌仪厂家-上海郓曹 | 上海网站建设-上海网站制作-上海网站设计-上海做网站公司-咏熠软件 | 即用型透析袋,透析袋夹子,药敏纸片,L型涂布棒-上海桥星贸易有限公司 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 地脚螺栓_材质_标准-永年县德联地脚螺栓厂家 | 气动绞车,山东气动绞车,气动绞车厂家-烟台博海石油机械有限公司 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 |