日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

ASP.NET Core實(shí)現(xiàn)中間件的幾種方式

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

前言

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

換句人話(huà)來(lái)說(shuō),

對(duì)于寫(xiě)代碼的人而言,一切皆中間件.

業(yè)務(wù)邏輯/數(shù)據(jù)訪(fǎng)問(wèn)/等等一切都需要以中間件的方式來(lái)呈現(xiàn).

那么我們必須學(xué)會(huì)如何實(shí)現(xiàn)自定義中間件 這里劃重點(diǎn),必考

這里我們介紹下中間件的幾種實(shí)現(xiàn)方式...

匿名函數(shù)

通常新建一個(gè)空的 ASP.NET Core Web Application,項(xiàng)目名字無(wú)所謂啦

在啟動(dòng)類(lèi)里可以看到這么一句:

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

這就是一個(gè)匿名函數(shù)實(shí)現(xiàn)的中間件,雖然內(nèi)容比較少.

可以看到通過(guò)匿名函數(shù)實(shí)現(xiàn)的中間件是內(nèi)嵌在啟動(dòng)類(lèi)文件中的,因此通常也叫做內(nèi)聯(lián)中間件

接下來(lái),我們通過(guò)匿名函數(shù)來(lái)實(shí)現(xiàn)內(nèi)聯(lián)中間件,以便加深理解.

然后修改啟動(dòng)類(lèi)代碼如下:

// 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();    }    // 使用匿名函數(shù)實(shí)現(xiàn)一個(gè)內(nèi)聯(lián)中間件    app.Use(async (context, next) =>    {throw new NotImplementedException("一個(gè)使用匿名函數(shù),但未實(shí)現(xiàn)具體內(nèi)容的內(nèi)聯(lián)中間件");    });    app.Run(async (context) =>    {await context.Response.WriteAsync("Hello World!");    });}    }}

這里我們?cè)?app.Run 之前使用 app.Use 添加一個(gè)匿名函數(shù)實(shí)現(xiàn)的內(nèi)聯(lián)中間件,按照中間件的注冊(cè)順序,當(dāng)發(fā)起請(qǐng)求時(shí),會(huì)拋出一個(gè)異常 NotImplementedException("一個(gè)使用匿名函數(shù),但未實(shí)現(xiàn)具體內(nèi)容的內(nèi)聯(lián)中間件")

我們 F5 啟動(dòng)下,看看頁(yè)面

嗯,符合預(yù)期.

我們?cè)賮?lái)調(diào)整下啟動(dòng)類(lèi),代碼如下:

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();    }    // 使用匿名函數(shù)實(shí)現(xiàn)一個(gè)內(nèi)聯(lián)中間件    app.Use(async (context, next) =>    {// 這里不對(duì) request 做任何處理,直接調(diào)用下一個(gè)中間件await next.Invoke();    });    app.Run(async (context) =>    {await context.Response.WriteAsync("Hello World!");    });}    }}

這里我們?cè)?app.Run 之前使用 app.Use 添加一個(gè)匿名函數(shù)實(shí)現(xiàn)的內(nèi)聯(lián)中間件,該中間件沒(méi)有對(duì) request 做任何處理,只是一個(gè)空的空間件,按照中間件的注冊(cè)順序,當(dāng)發(fā)起請(qǐng)求時(shí),頁(yè)面應(yīng)該顯示 Hello World!.

我們 F5 啟動(dòng),看看效果

嗯,符合預(yù)期.

個(gè)人覺(jué)得:匿名函數(shù)不是很直觀(guān),但是用內(nèi)聯(lián)的方式可以快速開(kāi)始一些開(kāi)發(fā),不用新建一個(gè)中間件類(lèi),不用專(zhuān)門(mén)想個(gè)不一樣的名字,小場(chǎng)景下是非常方便實(shí)用的

實(shí)現(xiàn)接口

通過(guò)實(shí)現(xiàn)接口 IMiddleware 編寫(xiě)自定義中間件,這是一種強(qiáng)類(lèi)型的方式,我們需要必須強(qiáng)制按照接口的定義來(lái)實(shí)現(xiàn).

IMiddleware

接口 IMiddleware 定義如下:

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

可以看到接口 IMiddleware 的命名空間是 Microsoft.AspNetCore.Http,需要實(shí)現(xiàn)的方法是InvokeAsync(),看起來(lái)不算太復(fù)雜, 嗯,看起來(lái)不算太復(fù)雜

嗯,重新開(kāi)始,我們新建一個(gè)空的 ASP.NET Core Web Application

然后我們通過(guò)實(shí)現(xiàn)接口的方式來(lái)自定義一個(gè)中間件,代碼如下:

// 新建類(lèi) 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();}    }}

按照上面實(shí)現(xiàn)的中間件 MyMiddleware,在執(zhí)行時(shí)應(yīng)該會(huì)拋出 NotImplementedException.

使用接口實(shí)現(xiàn)的中間件需要在先在服務(wù)容器中注冊(cè)

// 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){    // 在服務(wù)容器中注冊(cè)自定義中間件    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 啟動(dòng),頁(yè)面上可以看到如下結(jié)果:

符合我們上面的預(yù)期,拋出了一個(gè) 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){    // 這里不對(duì) request 做任何處理,直接調(diào)用下一個(gè)中間件    await next(context);}    }}

這里相當(dāng)于我們實(shí)現(xiàn)了一個(gè)叫做 MyMiddleware 的中間件,但是并沒(méi)有對(duì)請(qǐng)求進(jìn)行任何處理,頁(yè)面上應(yīng)該正常顯示 Hello World! 字符串.

然后我們 F5 啟動(dòng)看看

嗯...符合預(yù)期.

個(gè)人覺(jué)得:這種方式最符合面向?qū)ο蟮奶匦?也符合面向接口的原則,少一些難以理解的魔法,反而有助于理解.

約定方式

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

那么編寫(xiě)中間件的約定是什么呢?

重新開(kāi)始,新建一個(gè)空的 ASP.NET Core Web Application

然后新建一個(gè)類(lèi),類(lèi)名叫做 MyMiddleware 好了,代碼如下:

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

約定的內(nèi)容,就是滿(mǎn)足2個(gè)需要...不滿(mǎn)足需要?jiǎng)t異常.

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

// 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();    }    // 注冊(cè)自定義中間件    // 注冊(cè)順序=1    app.UseMiddleware<MyMiddleware>();    app.Run(async (context) =>    {await context.Response.WriteAsync("Hello World!");    });}    }}

然后 F5 啟動(dòng),來(lái)看看效果

嗯,符合預(yù)期.

然后我們來(lái)調(diào)整下中間件,讓請(qǐng)求能正常響應(yīng)輸出 Hello World!

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

然后 F5 啟動(dòng),看看效果

嗯,符合預(yù)期.

個(gè)人覺(jué)得:只能說(shuō)一句,約定方式是目前用的最多的方式...

End

寫(xiě)在最后

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

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

標(biāo)簽: ASP.NET
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷成人基地| 香蕉久久99| 在线视频日韩| 女人天堂亚洲aⅴ在线观看| 亚洲永久av| 国产精品magnet| 日韩福利视频导航| 欧美亚洲专区| 国产精品xxxav免费视频| 欧美一区激情| 国产激情综合| 国产一二在线播放| 日韩毛片视频| 午夜久久一区| 亚洲一区二区三区久久久| 日韩精品一级中文字幕精品视频免费观看 | 亚洲欧美日韩视频二区| 欧美99久久| 日韩中文影院| 男女精品网站| 日韩高清在线观看一区二区| 日韩精品第一| 日本电影久久久| 欧美国产日韩电影| 免费高潮视频95在线观看网站| 激情欧美亚洲| 国产欧美日韩亚洲一区二区三区| 精品视频黄色| 合欧美一区二区三区| 日本中文字幕一区二区| 久久精品一区| 夜夜嗨一区二区| 中文精品在线| 欧美日韩国产在线观看网站| 亚洲免费黄色| 亚州av一区| 国产精品久久777777毛茸茸| 97欧美在线视频| 免费国产亚洲视频| 精品网站aaa| 视频一区国产视频| 在线一区av| 国产香蕉精品| 国产精品普通话对白| 国产精品国码视频| 欧美专区18| 久久精选视频| 国产日韩一区| 免费观看久久av| 国产精品www994| 伊人精品在线| 欧洲av不卡| 国产精品美女在线观看直播| 欧美日韩国产免费观看| 91亚洲国产高清| 里番精品3d一二三区| 国产日韩欧美中文在线| 亚洲网址在线观看| 国产美女精品| 亚洲无线一线二线三线区别av| 国产精品亚洲人成在99www| 久久午夜视频| 不卡视频在线| 美女久久久久| 国产精品女主播一区二区三区| 视频福利一区| av日韩中文| 日韩国产一区二区三区| 国产中文字幕一区二区三区| 国产欧美69| 精品国产亚洲一区二区三区| 国内精品亚洲| а√天堂8资源中文在线| 久久青青视频| 欧美午夜精品一区二区三区电影| 日韩高清成人| 欧美va天堂在线| 日韩午夜一区| 日本一区二区中文字幕| 日韩精品国产精品| 国产精品亚洲片在线播放| 国产精品igao视频网网址不卡日韩| 国产精品综合色区在线观看| 久久精品国产精品亚洲毛片| 成人av三级| av一区二区高清| 深夜福利亚洲| 精品久久视频| 日韩视频精品在线观看| 日韩黄色av| av综合电影网站| 一区二区三区国产在线| 亚洲3区在线| 福利视频一区| 天堂成人免费av电影一区 | 91欧美极品| 精品91福利视频| 男人天堂欧美日韩| 精品国产麻豆| 丝瓜av网站精品一区二区| 麻豆国产精品一区二区三区| 亚洲一级网站| 久久超级碰碰| 另类av一区二区| 久久国产尿小便嘘嘘| 欧美中文一区二区| 国产精品一区二区精品视频观看| 久久中文字幕av| 国产精品久久777777毛茸茸| 99视频一区| 久久国产日韩| 红杏一区二区三区| 亚洲美女久久| 午夜日韩在线| 在线看片福利| 久久亚洲道色| 国产精品视频一区二区三区| 亚洲综合小说| 中国女人久久久| 免费亚洲婷婷| 国产精品日本一区二区三区在线| 亚洲欧美久久久| 激情欧美亚洲| 欧美日韩一区二区三区视频播放| 免费一级欧美在线观看视频| 日韩av电影一区| 日韩国产欧美视频| 亚洲一区欧美| 亚洲毛片视频| 一区二区高清| 亚洲精品一级| 日韩三区四区| 97久久亚洲| 国产欧美精品久久| 日韩视频一二区| 欧美天堂在线| 免费在线亚洲欧美| 粉嫩av一区二区三区四区五区 | 久久亚洲一区| 一区二区三区网站| 综合激情网站| 久久av综合| 国产91欧美| 成人午夜网址| 欧洲激情综合| 日韩精品三级| 国产不卡一区| 国产一区亚洲| 亚洲我射av| 精品一区二区三区四区五区| 欧美国产一级| 中文一区在线| 国产精品v日韩精品v欧美精品网站| 水蜜桃久久夜色精品一区| 国产综合色产| 欧美一区二区三区免费看| 日韩久久电影| 日韩精品中文字幕吗一区二区| 国产日韩一区| 欧美高清一区| 欧美激情视频一区二区三区免费| 国产综合色区在线观看| 亚洲精品麻豆| 日韩欧美精品| 三级久久三级久久久| 理论片午夜视频在线观看| 蜜臀91精品一区二区三区| 麻豆成人91精品二区三区| 黄色在线一区| 伊人久久av| 国产人成精品一区二区三| 999久久久免费精品国产| 久久精品999| 欧美中文一区二区| 国产极品一区| 免费成人av在线播放| 久久久精品午夜少妇| 国产精品s色| 日本一区中文字幕| 亚洲少妇一区| 特黄特色欧美大片| 麻豆成人av在线| 欧美日韩亚洲一区三区| 中文一区一区三区免费在线观| 亚洲国产福利| 麻豆成人av在线| 国产精品亚洲四区在线观看| 亚洲精品国产精品粉嫩| 婷婷激情久久| 欧美日韩精品免费观看视完整| 欧美国产另类| 麻豆久久久久久久| 国产精品红桃| 日韩激情综合| 成人精品高清在线视频| 蜜桃tv一区二区三区| 欧美日韩国产观看视频| 久久香蕉精品香蕉| 久久婷婷国产| 成人午夜在线|