【譯】ASP.NET CORE 2.0 中間件

Asp.net core 2.0

== 原文地址已不能訪問(wèn)捌显,停止本系列更新==

問(wèn)題

使用ASP.NET Core中間件創(chuàng)建Hello World

解決方案

從上一篇的空項(xiàng)目開(kāi)始,如下修正Startup.cs中的Configure()方法

 public void Configure(
            IApplicationBuilder app,
            IHostingEnvironment env)
        {
            // setup request pipeline using middleware
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World! (Run)");
            });
        }

一個(gè)不錯(cuò)的練習(xí)使用擴(kuò)展方法在IApplicationBuilder 上build pipeline:

 // RunMiddlewareExtensions.cs
        public static void RunHelloWorld(this IApplicationBuilder app)
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World! (Run)");
            });
        }
        // Startup.cs
        public void Configure(
            IApplicationBuilder app,
            IHostingEnvironment env)
        {
            // setup request pipeline using middleware
            app.RunHelloWorld();
        }

上一段代碼中我們使用IApplicationBuilder.Run() 配置中間件,另一種方法是用這個(gè)IApplicationBuilder.Run()

 // UseMiddlewareExtensions.cs
        public static IApplicationBuilder UseHelloWorld(
            this IApplicationBuilder app)
        {
            return app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync("Hello World! (Use)\n");
                await next();
            });
        }
        // Startup.cs
        public void Configure(
            IApplicationBuilder app,
            IHostingEnvironment env)
        {
            // setup request pipeline using middleware
            app.UseHelloWorld();
            app.RunHelloWorld();
        }

一個(gè)不錯(cuò)的練習(xí)如何使用中間件定義在單獨(dú)的類(lèi)中

 public class HelloWorldMiddleware
    {
        private readonly RequestDelegate next;

        public HelloWorldMiddleware(RequestDelegate next)
        {
            this.next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            await context.Response.WriteAsync("Hello World! (Use in Class)\n");
            await this.next(context);
        }
    }
    // UseMiddlewareExtensions.cs
    public static IApplicationBuilder UseHelloWorldInClass(
       this IApplicationBuilder app)
    {
          return app.UseMiddleware<HelloWorldMiddleware>();
    }
    // Startup.cs
    public void Configure(
            IApplicationBuilder app,
            IHostingEnvironment env)
    {
        // setup request pipeline using middleware
        app.UseHelloWorld();
        app.UseHelloWorldInClass();
        app.RunHelloWorld();
    }

討論

中間件是一個(gè)攔截HTTP請(qǐng)求和響應(yīng)消息的組件。我們創(chuàng)建這些組件連來(lái)構(gòu)建我們的應(yīng)用管道。
我們?cè)O(shè)置這個(gè)管道通過(guò)Configure()方法挥吵,IApplicationBuilder是參數(shù)重父,有下面三個(gè)方法:

  1. Run(): 添加一個(gè)中間件到管道花椭, 不繼續(xù)調(diào)用其他中間件
  2. Use(): 添加一個(gè)中間件,使用Lambda或者單獨(dú)的類(lèi)
  3. Map(): 根據(jù)請(qǐng)求路徑添加中間件
Run

它用RequestDelegate 作為參數(shù)房午,當(dāng)調(diào)用的時(shí)候用HttpContext作為參數(shù)矿辽, 返回void無(wú)類(lèi)型,應(yīng)為這個(gè)是短的請(qǐng)求管道郭厌。

Use

它用Func作為參數(shù)袋倔, 也就是把HttpContext和指針(Pointer)傳到下一個(gè)中間件, 返回Task折柠。 如果下個(gè)中間件沒(méi)有調(diào)用宾娜,那他就是一個(gè)短的請(qǐng)求管道,和Run一樣扇售。

UseMiddleware

當(dāng)我們?cè)O(shè)置一個(gè)中間件的類(lèi)時(shí)前塔,我們要用UseMiddleware去包裝,提供我們的類(lèi)和泛型參數(shù)承冰。
獨(dú)立的中間件類(lèi)有兩個(gè)關(guān)鍵內(nèi)容:

  1. 構(gòu)成方法接受RequestDelegate华弓。 這個(gè)會(huì)調(diào)用請(qǐng)求到下一個(gè)中間件
  2. 它用Invoke接受參數(shù)HttpContext返回Task。 框架會(huì)根據(jù)需要調(diào)用中間件困乒。
    注:用獨(dú)立的類(lèi)實(shí)現(xiàn)中間件并且用UseMdilleware是最佳實(shí)踐
擴(kuò)展方法

知道擴(kuò)展方法的區(qū)別寂屏,RunXXX不支持返回值,然后UseXXX支持娜搂。這個(gè)是應(yīng)為Run()是短路徑請(qǐng)求管道迁霎,而Use()是以連的的形式連接其他中間件。

順序

中間件調(diào)用順序如他們?cè)?code>Configure()方法里百宇,按添加他們到管道的順序考廉。在響應(yīng)方面,返回給客戶(hù)端也是傳遞一樣的中間件管道恳谎。

Source Code

GitHub:

https://github.com/TahirNaushad/Fiver.Asp.Middleware

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芝此,一起剝皮案震驚了整個(gè)濱河市憋肖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婚苹,老刑警劉巖岸更,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膊升,居然都是意外死亡怎炊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)廓译,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)评肆,“玉大人,你說(shuō)我怎么就攤上這事非区」贤欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵征绸,是天一觀的道長(zhǎng)久橙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)管怠,這世上最難降的妖魔是什么淆衷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮渤弛,結(jié)果婚禮上祝拯,老公的妹妹穿的比我還像新娘。我一直安慰自己她肯,他們只是感情好佳头,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著辕宏,像睡著了一般畜晰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瑞筐,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天凄鼻,我揣著相機(jī)與錄音,去河邊找鬼聚假。 笑死块蚌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膘格。 我是一名探鬼主播峭范,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘪贱!你這毒婦竟也來(lái)了纱控?” 一聲冷哼從身側(cè)響起辆毡,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甜害,沒(méi)想到半個(gè)月后舶掖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尔店,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年眨攘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚣州。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲫售,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出该肴,到底是詐尸還是另有隱情情竹,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布沙庐,位于F島的核電站鲤妥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拱雏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一底扳、第九天 我趴在偏房一處隱蔽的房頂上張望铸抑。 院中可真熱鬧,春花似錦衷模、人聲如沸鹊汛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刁憋。三九已至,卻和暖如春木蹬,著一層夾襖步出監(jiān)牢的瞬間至耻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工镊叁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尘颓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓晦譬,卻偏偏與公主長(zhǎng)得像疤苹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敛腌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容