1. ASP.NET Core 中間件

        共 3300字,需瀏覽 7分鐘

         ·

        2020-09-04 15:36

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

        前言


        對中間件的一個概況,在《重新整理.net core 計1400篇》系列后面會深入。


        正文


        什么是中間件呢?


        其實中間件這個概念來源于分布式,當然這是一個狹隘的概念了,現(xiàn)在中間件概念就非常廣泛了。



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


        看一段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);


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

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


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


        那么問題來了,問什么叫做中間件呢?從語文的層面上理解,那就是分開的,一件一件的。


        把這件要執(zhí)行的這些封裝成一個一個模塊,那么這些模塊,這些可以通過調(diào)用next執(zhí)行下一個模塊,同樣,如果不調(diào)用,那么中間件模塊就會中斷,因為有時候真的需要中斷,比如說權(quán)限中間件,


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


        • 用 Use 將多個請求委托鏈接在一起。next 參數(shù)表示管道中的下一個委托??赏ㄟ^不調(diào)用 next 參數(shù)使管道短路。


        • 當委托不將請求傳遞給下一個委托時,它被稱為“讓請求管道短路”。通常需要短路,因為這樣可以避免不必要的工作。


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



        挺合理的一個東西,一開始就填入了異常處理機制。


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


        因為這個endpoint 是不建議我們修改的,當然我們可以修改源碼中,畢竟開源了,but not must。


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



        當然我們也可以進行對endpoint自我的調(diào)整,因為可能使用不同的模板引擎:


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


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


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


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



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


        擴展方法


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


        加入中間件隊列


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


        request 順序



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

        往期精彩回顧




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

        .NET Core實戰(zhàn)項目之CMS 第一章 入門篇-開篇及總體規(guī)劃

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

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

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

        10個小技巧助您寫出高性能的ASP.NET Core代碼

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

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

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

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

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

        給我好看

        您看此文用

        ??·?

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

        好看你就

        點點


        瀏覽 77
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
          
          

            1. 欧美成人A片无码高清 | 久久久无码国产精品免费 | 青青草成人在线观看 | 热99在线视频 | 国产无遮挡又黄又爽又色学生软件 |