成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

ASP.NET Core實現中間件的幾種方式

瀏覽:807日期:2022-06-08 13:29:13

前言

ASP.NET Core 中 HTTP 管道使用中間件組合處理的方式,

換句人話來說,

對于寫代碼的人而言,一切皆中間件.

業務邏輯/數據訪問/等等一切都需要以中間件的方式來呈現.

那么我們必須學會如何實現自定義中間件 這里劃重點,必考

這里我們介紹下中間件的幾種實現方式...

匿名函數

通常新建一個空的 ASP.NET Core Web Application,項目名字無所謂啦

在啟動類里可以看到這么一句:

// Startup.cs// ...app.Run(async (context) =>{    await context.Response.WriteAsync("Hello World!");});// ...

這就是一個匿名函數實現的中間件,雖然內容比較少.

可以看到通過匿名函數實現的中間件是內嵌在啟動類文件中的,因此通常也叫做內聯中間件

接下來,我們通過匿名函數來實現內聯中間件,以便加深理解.

然后修改啟動類代碼如下:

// Startup.csusing Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Http;using Microsoft.Extensions.DependencyInjection;using System;namespace WebApplication1{    public class Startup    {public void ConfigureServices(IServiceCollection services){}public void Configure(IApplicationBuilder app, IHostingEnvironment env){    if (env.IsDevelopment())    {app.UseDeveloperExceptionPage();    }    // 使用匿名函數實現一個內聯中間件    app.Use(async (context, next) =>    {throw new NotImplementedException("一個使用匿名函數,但未實現具體內容的內聯中間件");    });    app.Run(async (context) =>    {await context.Response.WriteAsync("Hello World!");    });}    }}

這里我們在 app.Run 之前使用 app.Use 添加一個匿名函數實現的內聯中間件,按照中間件的注冊順序,當發起請求時,會拋出一個異常 NotImplementedException("一個使用匿名函數,但未實現具體內容的內聯中間件")

我們 F5 啟動下,看看頁面

嗯,符合預期.

我們再來調整下啟動類,代碼如下:

using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Http;using Microsoft.Extensions.DependencyInjection;namespace WebApplication1{    public class Startup    {public void ConfigureServices(IServiceCollection services){}public void Configure(IApplicationBuilder app, IHostingEnvironment env){    if (env.IsDevelopment())    {app.UseDeveloperExceptionPage();    }    // 使用匿名函數實現一個內聯中間件    app.Use(async (context, next) =>    {// 這里不對 request 做任何處理,直接調用下一個中間件await next.Invoke();    });    app.Run(async (context) =>    {await context.Response.WriteAsync("Hello World!");    });}    }}

這里我們在 app.Run 之前使用 app.Use 添加一個匿名函數實現的內聯中間件,該中間件沒有對 request 做任何處理,只是一個空的空間件,按照中間件的注冊順序,當發起請求時,頁面應該顯示 Hello World!.

我們 F5 啟動,看看效果

嗯,符合預期.

個人覺得:匿名函數不是很直觀,但是用內聯的方式可以快速開始一些開發,不用新建一個中間件類,不用專門想個不一樣的名字,小場景下是非常方便實用的

實現接口

通過實現接口 IMiddleware 編寫自定義中間件,這是一種強類型的方式,我們需要必須強制按照接口的定義來實現.

IMiddleware

接口 IMiddleware 定義如下:

using System.Threading.Tasks;namespace Microsoft.AspNetCore.Http{    public interface IMiddleware    {Task InvokeAsync(HttpContext context, RequestDelegate next);    }}

可以看到接口 IMiddleware 的命名空間是 Microsoft.AspNetCore.Http,需要實現的方法是InvokeAsync(),看起來不算太復雜, 嗯,看起來不算太復雜

嗯,重新開始,我們新建一個空的 ASP.NET Core Web Application

然后我們通過實現接口的方式來自定義一個中間件,代碼如下:

// 新建類 MyMiddleware.csusing Microsoft.AspNetCore.Http;using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace WebApplication1{    public class MyMiddleware : IMiddleware    {public Task InvokeAsync(HttpContext context, RequestDelegate next){    throw new NotImplementedException();}    }}

按照上面實現的中間件 MyMiddleware,在執行時應該會拋出 NotImplementedException.

使用接口實現的中間件需要在先在服務容器中注冊

// Startup.csusing Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Http;using Microsoft.Extensions.DependencyInjection;namespace WebApplication1{    public class Startup    {public void ConfigureServices(IServiceCollection services){    // 在服務容器中注冊自定義中間件    services.AddSingleton<MyMiddleware>();}public void Configure(IApplicationBuilder app, IHostingEnvironment env){    if (env.IsDevelopment())    {app.UseDeveloperExceptionPage();    }    // 使用 UseMiddleware() 把自定義中間件添加到管道中    app.UseMiddleware<MyMiddleware>();    app.Run(async (context) =>    {await context.Response.WriteAsync("Hello World!");    });}    }}

然后 F5 啟動,頁面上可以看到如下結果:

符合我們上面的預期,拋出了一個 NotImplementedException.

然后我們改造下 MyMiddleware 中間件

// MyMiddleware.csusing Microsoft.AspNetCore.Http;using System.Threading.Tasks;namespace WebApplication1{    public class MyMiddleware : IMiddleware    {public async Task InvokeAsync(HttpContext context, RequestDelegate next){    // 這里不對 request 做任何處理,直接調用下一個中間件    await next(context);}    }}

這里相當于我們實現了一個叫做 MyMiddleware 的中間件,但是并沒有對請求進行任何處理,頁面上應該正常顯示 Hello World! 字符串.

然后我們 F5 啟動看看

嗯...符合預期.

個人覺得:這種方式最符合面向對象的特性,也符合面向接口的原則,少一些難以理解的魔法,反而有助于理解.

約定方式

編程世界有這么一句話,叫"約定大于配置".

那么編寫中間件的約定是什么呢?

重新開始,新建一個空的 ASP.NET Core Web Application

然后新建一個類,類名叫做 MyMiddleware 好了,代碼如下:

// MyMiddleware.csusing Microsoft.AspNetCore.Http;using System;using System.Threading.Tasks;namespace WebApplication1{    public class MyMiddleware    {// 1. 需要實現一個構造函數,參數為 RequestDelegatepublic MyMiddleware(RequestDelegate next){}// 2. 需要實現一個叫做 InvokeAsync 方法public async Task InvokeAsync(HttpContext context){    throw new NotImplementedException("這是一個按照約定方式編寫的中間件,但未實現具體內容");}    }}

約定的內容,就是滿足2個需要...不滿足需要則異常.

然后我們把這個中間件,注冊到管道中,以便使用

// Startup.csusing Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Http;using Microsoft.Extensions.DependencyInjection;namespace WebApplication1{    public class Startup    {public void ConfigureServices(IServiceCollection services){}public void Configure(IApplicationBuilder app, IHostingEnvironment env){    if (env.IsDevelopment())    {app.UseDeveloperExceptionPage();    }    // 注冊自定義中間件    // 注冊順序=1    app.UseMiddleware<MyMiddleware>();    app.Run(async (context) =>    {await context.Response.WriteAsync("Hello World!");    });}    }}

然后 F5 啟動,來看看效果

嗯,符合預期.

然后我們來調整下中間件,讓請求能正常響應輸出 Hello World!

using Microsoft.AspNetCore.Http;using System;using System.Threading.Tasks;namespace WebApplication1{    public class MyMiddleware    {private readonly RequestDelegate _next;// 需要實現一個構造函數,參數為 RequestDelegatepublic MyMiddleware(RequestDelegate next){    _next = next;}// 需要實現一個叫做 InvokeAsync 方法public async Task InvokeAsync(HttpContext context){    // 不處理任何 request, 直接調用下一個中間件    await _next.Invoke(context);}    }}

然后 F5 啟動,看看效果

嗯,符合預期.

個人覺得:只能說一句,約定方式是目前用的最多的方式...

End

寫在最后

Tips: 有些內容可能看起來還是不太容易理解,至少當下你是很難理解的,但是套路就在哪里,好比1+1=2,你知道1+1為什么=2么?但你一定會算會用1+1=2...

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽: ASP.NET
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美性视频一区二区三区| 亚洲成人综合网站| 亚洲精品免费在线播放| 欧美成人有码| 欧美一区二区三区免费在线看| 久热成人在线视频| 国产精品免费一区二区三区在线观看 | 免费久久99精品国产自| 一区二区在线免费观看| 在线精品在线| 国产精品传媒入口麻豆| 欧美亚洲不卡| 中文字幕永久在线不卡| 欧美特黄视频| 国产精品剧情在线亚洲| 亚洲午夜精品久久久久久浪潮| 中文字幕在线视频一区| 欧美日韩日本国产亚洲在线| 欧美国产日韩在线观看| 欧美日韩免费观看一区=区三区| 国产精品视频在线看| 国语精品中文字幕| 亚洲欧美日韩国产中文在线| 国产精品久久国产愉拍| 亚洲午夜精品17c| 色偷偷久久人人79超碰人人澡| 首页欧美精品中文字幕| 老司机精品久久| 另类成人小视频在线| 欧美日韩国产不卡| 成人免费毛片片v| 国产午夜亚洲精品不卡| 韩日成人在线| 亚洲国产精品影院| 久久久久久婷| 玖玖九九国产精品| 欧美一区二区三区在线视频| 91在线视频免费91| 亚洲欧美另类在线| 色婷婷综合中文久久一本| 国产一区二区三区在线看麻豆| 精品久久一区二区| 亚洲国产美女| 日韩不卡手机在线v区| 欧美日韩一区二区在线观看视频| 丁香婷婷综合激情五月色| 中文在线一区二区| 国产精品日韩久久久| 久久狠狠亚洲综合| www亚洲一区| 99成人精品| 久久精品99久久久| 久久男人中文字幕资源站| 99国产精品99久久久久久粉嫩| 日韩av午夜在线观看| 日韩一级片网址| 国产综合亚洲精品一区二| 亚洲国产一区二区a毛片| 欧美亚洲日本一区| 成人晚上爱看视频| 国产精品国产馆在线真实露脸| 亚洲一区影院| 国产一区二区三区精品视频| 国产亚洲欧美日韩在线一区| 国产一区二区高清| 国产在线观看一区二区| 国产欧美日韩另类一区| 蜜桃久久av| 风间由美一区二区av101| 国产精品国产a| 欧美亚洲另类激情小说| 99精品欧美一区二区蜜桃免费| 一区二区三区精品| 欧美一区日韩一区| 极品日韩久久| 久久av老司机精品网站导航| 国产欧美精品一区二区三区四区| 另类天堂av| 成人国产亚洲欧美成人综合网| 自拍偷拍亚洲综合| 欧美日韩国产三级| 国产精品啊啊啊| 蜜桃视频一区二区三区| 久久久不卡网国产精品二区| 一本到一区二区三区| 欧美一区高清| 午夜av区久久| 久久色视频免费观看| 美女网站久久| 成人久久视频在线观看| 亚洲一区二区三区影院| 欧美变态tickle挠乳网站| 国产日韩精品久久| 国产成人综合亚洲网站| 亚洲精品视频在线看| 日韩一区二区三区电影| 国产区欧美区日韩区| 成人免费电影视频| 天天射综合影视| 欧美韩国日本一区| 欧美日韩国产片| 国产精品久久久久久久久久直播 | a级精品国产片在线观看| 亚洲一区二区黄色| 亚洲精品一区二区在线观看| 久久影院亚洲| 海角社区69精品视频| 国产成人精品影视| 亚洲线精品一区二区三区八戒| 26uuu另类欧美亚洲曰本| 色婷婷综合激情| 精品福利av| 风流少妇一区二区| 日韩高清国产一区在线| 国产精品久久久久久久久动漫| 欧美另类高清zo欧美| 国产伦精品一区二区三区四区免费| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 99热99精品| 麻豆精品久久久| 亚洲精品中文在线影院| 久久精品网站免费观看| 欧美电影在哪看比较好| 国产精品日韩欧美一区二区三区| 99久精品国产| 黄一区二区三区| 亚洲国产精品久久艾草纯爱 | 欧美片网站yy| 久久影院亚洲| 日韩五码在线| 欧美日韩亚洲免费| 成人app网站| 国产在线视频一区二区三区| 偷拍与自拍一区| 亚洲精品日韩综合观看成人91| 久久精品一二三| 日韩一级大片在线观看| 欧美午夜精品久久久久久超碰| 国产精品外国| 在线成人www免费观看视频| 99久久精品一区二区| 国产传媒日韩欧美成人| 久久99精品国产麻豆婷婷| 亚洲成人免费视| 洋洋成人永久网站入口| 亚洲欧洲国产日韩| 国产视频视频一区| 欧美sm美女调教| 在线不卡一区二区| 欧美伊人久久大香线蕉综合69| 亚洲尤物精选| 在线亚洲免费| 日韩午夜免费| 怡红院精品视频在线观看极品| 欧美.www| 欧美黄免费看| 欧美影视一区| 99久久国产免费看| 波多野结衣视频一区| 豆国产96在线|亚洲| 国产精品亚洲а∨天堂免在线| 看电视剧不卡顿的网站| 日本v片在线高清不卡在线观看| 天天影视色香欲综合网老头| 亚洲成人av一区二区三区| 亚洲伊人伊色伊影伊综合网| 亚洲欧美色图小说| 亚洲欧美激情插| 亚洲免费资源在线播放| 又紧又大又爽精品一区二区| 亚洲精品第一国产综合野| 亚洲另类春色校园小说| 一区二区三区久久久| 亚洲午夜在线观看视频在线| 亚洲已满18点击进入久久| 亚洲成国产人片在线观看| 无码av免费一区二区三区试看| 石原莉奈一区二区三区在线观看| 五月天亚洲婷婷| 日韩专区欧美专区| 日韩电影在线一区二区| 日韩精品成人一区二区三区| 日韩av一区二区在线影视| 美女高潮久久久| 激情综合色综合久久| 国产成人免费视频网站 | 亚洲大尺度视频在线观看| 午夜欧美在线一二页| 日韩精品视频网| 久久99久久99| 国产成人在线影院| 不卡的av在线播放| 欧美日韩一卡| 宅男噜噜噜66一区二区| 亚洲伊人网站| 欧美日韩一卡二卡三卡| 日韩免费高清视频| 亚洲国产精品精华液ab| 一区二区在线观看视频| 丝袜美腿亚洲一区|