<thead id="dlkbl"></thead>
    <sub id="dlkbl"><del id="dlkbl"></del></sub>

  • <thead id="dlkbl"><del id="dlkbl"></del></thead>
      <blockquote id="dlkbl"><del id="dlkbl"><legend id="dlkbl"></legend></del></blockquote>

      Asp.net core中间件实现原理及用法解说

      简述asp.net core中间件的实现思路

       原文地址:https://www.cnblogs.com/shengyu-kmust/p/11583974.html

      一次http请求的过程,就是对一个Request请求进行若干次逻辑处理,并最终设置Response的过程。从代码的实现维度看,由于Request和Response都在HttpContext里,可将此过程表示为“以一个httpContext为输入的委托函数”,即delegate Task RequestDelegate(HttpContext context),为方便此文的描述,我们将此委托函数暂时称为“请求处理逻辑”

       分享图片

       

      而中间件的作用,就是在请求的后面加入一个处理逻辑,这个处理逻辑是以“前一个请求处理逻辑”为输入,并经过中间件自己的处理后,返回一个“新的请求处理逻辑”。所以从代码上可将“中间件”表式为以一个“请求处理逻辑”为输入并返回另一个“请求处理逻辑”的委托,即Func<RequestDelegate,RequestDelegate>。而多个中间件即表示为List<Func<RequestDelegate,RequestDelegate>>。

       分享图片

       

      Asp.net core中间件的核心功能就是如何将一系列的中间件,合并成一个“请求处理逻辑”的过程,即如何将List<Func<RequestDelegate,RequestDelegate>>合并生成一个RequestDelegate。合并逻辑如下

       分享图片

       分享图片

      上面的代码有两个地方要注意

      1、asp.net core会默认在请求的最后加入一个“404”处理的中间件。   

      2、合并时,组件是先反序后再循环的

         因先加入的中间件要先执行,所以在合并时,第一个中间件要最后合并,即要倒序后再循环合并中间件

       

      如何使用中间件

      使用中间件有四种方法:Use、Run、Map和使用Middleware class,但前三种方法最终调用的都是Use方法,我们来看看Use方法的实现逻辑,如下

       分享图片

       

      即use方法只是在中间件列表(_components)的最后再加入一个中间件

       

      下面详细描述四种方法的用法

       

      Use的用法

      Ues的用法有两种

      用法一

      调用IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware),此用法需在middleware委托里自己控制是否要进入下一个中间件,并且要自己创建一个RequestDelegate并返回,写法会比较复杂。

      示例如下

       分享图片

      用法二

      调用IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware),这是一个扩展方法,此方法不用自己创建RequestDelegate并返回,写法比较简洁。它最终调用的方法还是用法一中的实现,此方法的实现代码如下。

       分享图片

      示例如下

       分享图片

       

      需注意:上面的两种Use用法,在第二个中间件时,并没有再调用下一个中间件,这是为了确保http请求不会进入到asp.net core默认的最后一个404中间件,因为最后一个404中间件设置了status code,而一但response body之前已经开始写入时,是不能再改变status code或是request header的,否则会报错。微软的官方文档里要求中间件的使用要遵循如下规则:如response body改变后就不要再调用下一个中间件,避免下一个中间件对上一个中间件的httpcontext内容的污染。(本文示例为演示目的,未遵循此约定)

       分享图片

       

       

      run的用法

      run方法的实现代码如下

       分享图片

      分享图片

      注意:从run方法的实现的代码可以看出,run是不会再执行下一个中间件的,所以第一个中间run方法后面的中间件都不会起作用。所以一般用run时都是放在中间件的最后

       

       

      map的用法

      map其实准确来说不是中间件的用法,而是新开一个“中间件请求路线分支”,在这个“分支”里,可以再用use和run方法来组件一个新的中间件逻辑。

      示例如下

       分享图片

      如上示例,请求地址当能匹配上/test里,才会启用map里的中间件

       

      Middleware class的用法

      Middleware class不需要继承任何类或是接口,但必须有名为Invoke,返回类型为Task,且第一个参数为HttpContext类型的方法。

      示例如下

       分享图片

      分享图片

       

       

       

      Asp.net core内置中间件的介绍

       

      中间件名称

      如何使用及说明

      Authentication

      App.UseAuthentication,验证当前请求的用户,并设置HttpContext.User,当OAuth callbacks时,会中止执行下一个中间件。放到要用到用户验证的中间件前面

      Static File

      app.UseStaticFiles(),判断当前请求是否为静态文件,如果是则中止执行下一个中间件,否则继续下一个中间件。放到管道的最前

      Response Caching

      app.UseResponseCaching(),缓存中间件

      MVC

      app.UseMvc(),将MVC引入到中间件管道,如果请求的地址能找到对应的MVC路由,则中止执行下一个中间件。放到管道的最后。

      Exception

      app.UseDeveloperExceptionPage();或app.UseExceptionHandler();用于处理程序的异常信息。放到管道的最前

      Authorization 

      授权中间件。不需直接引用,App.UseMvc()会在内部调用,并配合app.UseAuthentication()一起使用。

       

       

      中间件的总结

      1、通过use,run,map,middleware class四种方法使用

      2、使用多个中间件时,需注意中间件的顺序

      3、在设计中间件时,请遵循“责任分离”原则,即一个中间件只对“单一责任”进行处理,如验证用户、授权等。

      4、如果对response body做了修改后,请不要再执行下一个中间件

      相关文章
      相关标签/搜索
      4887王中王鉄算盘开奖结 宁乡县| 兰考县| 高州市| 东乡族自治县| 克拉玛依市| 汶川县| 长宁区| 郧西县| 北京市| 西畴县| 萝北县| 阳山县| 广河县| 大田县| 新安县| 湘潭县| 益阳市| 武宁县| 呼玛县| 淮安市| 大城县| 奉节县| 秭归县| 辛集市| 思茅市| 普陀区| 安阳市| 年辖:市辖区| 靖江市| 镇雄县| 枝江市| 济阳县| 石景山区| 军事| 清镇市| 金华市| 肃宁县| 赤壁市| 措勤县| 安岳县| 巴楚县| 拜城县| 深州市| 基隆市| 拜城县| 岳阳县| 荣成市| 时尚| 建阳市| 武威市| 峨眉山市| 桐庐县| 弥勒县| 延庆县| 漠河县| 宝山区| 华安县| 凤阳县| 卫辉市| 兴城市| 西吉县| 潼南县| 贺兰县| 兰州市| 云林县| 萝北县| 贞丰县| 邛崃市| 阳朔县| 陆良县| 喀喇沁旗| 建瓯市| 开原市| 栖霞市| 营口市| 石景山区| 城固县| 道孚县| 虎林市| 抚宁县| 恭城| 宜阳县| 会昌县| 军事| 乌拉特前旗| 宁夏| 贵南县| 交城县| 婺源县| 厦门市| 库伦旗| 沭阳县| 兴宁市| 博罗县| 伽师县| 左权县| 绥棱县| 惠州市| 岫岩| 灵宝市| 东乡族自治县| 沙河市| 隆德县| 陇南市| 大关县| 寻乌县| 金山区| 广宗县| 普宁市| 鸡泽县| 崇仁县| 昭通市| SHOW| 武威市| 河南省| 靖安县| 繁昌县| 静乐县| 德格县| 马尔康县| 邵阳市| 通化市| 高尔夫| 新民市| 永福县| 朝阳县| 彭泽县| 黔西| 永顺县| 陆川县| 鄯善县| 屏东市| 开封县| 永登县| 汕尾市| 沽源县| 明星| 仙居县| 浦江县| 奈曼旗| 沂水县| 宜丰县| 朝阳区| 通渭县| 玉环县| 林甸县| 永寿县| 宽城| 东乡族自治县| 额济纳旗| 万全县| 隆安县| 绥德县| 奉化市| 黄大仙区| 綦江县| 谢通门县| 邹城市| 河南省| 奉新县| 余江县| 乌拉特中旗| 平阴县| 金乡县| 根河市| 保山市| 威海市| 澜沧| 东平县| 体育| 西平县| 恭城| 台安县| 福泉市| 天祝| 梅河口市| 平果县| 临清市| 政和县| 满城县| 兴安县| 图木舒克市| 大渡口区| 芜湖市| 韶关市| 彩票| 开化县| 武夷山市| 轮台县| 巴彦淖尔市| 如皋市| 神农架林区| 中方县| 云浮市| 思南县| 安福县| 大关县| 平山县| 茌平县| 和平县| 宣恩县| 田东县| 鹤峰县| 芜湖县| 伊春市| 额尔古纳市| 来安县| 正蓝旗| 铜川市| 蒙城县| 喀喇| 合山市| 商城县| 赞皇县| 通海县| 格尔木市| 合山市| 浪卡子县| 濮阳县| 内乡县| 肥东县| 襄垣县| 洛浦县| 鄯善县| 红原县| 长兴县| 杂多县| 富平县| 文水县| 灵武市| 平定县| 嘉祥县| 葫芦岛市| 雷波县| 定日县| 旬邑县| 南召县| 康平县| 许昌县| 南城县| 定襄县| 涞源县| 荣成市| 岫岩| 阳新县| 株洲县| 茂名市| 宾川县| 嘉鱼县| 盱眙县| 长春市| 霍城县| 普兰县| 永川市| 繁昌县| 叙永县| 公主岭市| 互助| 遂昌县| 洛宁县| 湘潭市| 临澧县| 富阳市| 南雄市| 白城市| 兰西县| 长春市| 伊通| 金昌市| 琼海市| 兴城市| 凌云县| 稷山县| 潮安县| 大化| 松潘县| 阳春市| 玉溪市| 临泽县| 涞水县| 宁强县| 莱阳市| 湾仔区| 子长县| 成都市| 河东区| 嵩明县| 宁夏| 云阳县| 类乌齐县| 永川市| 呼图壁县| 吉首市| 龙州县| 伽师县| 易门县| 永川市| 浦城县| 抚州市| 深州市| 和平区| 叙永县| 黄浦区| 渝中区| 织金县| 达拉特旗| 鹤峰县| 罗甸县| 体育| 普定县| 师宗县| 西乌| 永丰县| 旌德县| 抚松县| 安新县| 宁强县| 沅江市| 湖州市| 滦南县| 崇义县| 拉萨市| 临漳县| 蒙城县| 名山县| 平罗县| 天柱县| 丰顺县| 宁海县| 西吉县| 临西县| 临夏市| 英山县| 镶黄旗| 广安市| 广州市| 双流县| 化德县| 麻城市| 和静县| 宁明县| 封开县| 文安县| 沙坪坝区| 柘城县| 天镇县| 漳州市| 界首市| 定远县| 舞钢市| 伊宁县| 雷山县| 太白县| 文成县| 广元市| 噶尔县| 泾川县| 嫩江县| 阿瓦提县| 南涧| 延津县| 招远市| 平潭县| 禹城市| 定远县| 乡宁县| 措勤县| 龙南县| 安远县| 台北县| 三都| 新宾| 于田县| 庆安县| 来凤县| 潼南县| 哈密市| 高碑店市| 克什克腾旗| 九江县| 峡江县| 搜索| 桃源县| 会昌县| 永清县| 岳阳县| 四平市| 和平县| 乌恰县| 浪卡子县| 桐城市| 珠海市| 禄丰县| 花莲市| 思南县| 荃湾区| 永顺县| 应用必备| 永川市| 新野县| 白水县| 成武县| 东港市| 大埔区| 衡南县| 西吉县| 建平县| 吉安县| 河池市| 克拉玛依市| 元江| 桂平市| 得荣县| 河西区| 达孜县| 惠水县| 赤壁市| 通辽市| 扎赉特旗| 玉林市| 都昌县| 孝感市| 高清| 宝山区| 隆昌县| 都安| 青河县| 临湘市| 屏南县| 衡东县| 崇明县| 固镇县| 无为县| 玉山县| 寿阳县| 故城县| 钦州市| 虎林市| 长葛市| 涞源县| 景德镇市| 连州市| 剑川县| 外汇| 钦州市| 美姑县| 三亚市| 壤塘县| 玉龙| 万州区| 阜康市| 凯里市| 安乡县| 开封县| 和龙市| 卫辉市| 安远县| 上饶县| 华阴市| 砚山县| 天气| 东至县| 安顺市| 泽普县| 西盟| 岳阳县| 聊城市| 万山特区| 孙吴县| 固镇县| 怀柔区| 海门市| 安宁市| 东阿县| 南乐县| 伊宁市| 三原县| 汪清县| 杭州市| 云阳县| 神木县| 镇宁| 乡城县| 习水县| 新巴尔虎右旗| 大厂| 贞丰县| 南昌市| 望谟县| 全南县| 四平市| 铅山县| 新晃| 兴义市| 新绛县| 塔河县| 邓州市| 资阳市| 嘉峪关市| 锦屏县| 米易县| 南靖县| 奇台县| 江陵县| 玉龙| 渝中区| 武乡县| 怀柔区| 逊克县| 弥渡县| http://m.jp1860covero.fun http://wap.jp1860cozzento.fun http://bbs.jp1860franko.fun http://bbs.jp1860viewo.fun http://jp1860backo.fun http://jp1860pairo.fun http://www.jp1860chargeo.fun http://www.jp1860conducto.fun http://www.jp1860fronto.fun http://www.jp1860cottono.fun http://www.jp1860deterzineo.fun http://www.jp1860lasto.fun http://www.jp1860fronto.fun http://jp1860tello.fun http://bbs.jp1860steelo.fun