<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        ASP.NET Core Middleware的實(shí)現(xiàn)方法詳解

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:34:43
        文檔

        ASP.NET Core Middleware的實(shí)現(xiàn)方法詳解

        ASP.NET Core Middleware的實(shí)現(xiàn)方法詳解:概念 ASP.NET Core Middleware是在應(yīng)用程序處理管道pipeline中用于處理請(qǐng)求和操作響應(yīng)的組件。 每個(gè)組件: 在pipeline中判斷是否將請(qǐng)求傳遞給下一個(gè)組件 在處理管道的下個(gè)組件執(zhí)行之前和之后執(zhí)行一些工作, HttpContxt對(duì)象能跨域請(qǐng)求、響應(yīng)的執(zhí)行
        推薦度:
        導(dǎo)讀ASP.NET Core Middleware的實(shí)現(xiàn)方法詳解:概念 ASP.NET Core Middleware是在應(yīng)用程序處理管道pipeline中用于處理請(qǐng)求和操作響應(yīng)的組件。 每個(gè)組件: 在pipeline中判斷是否將請(qǐng)求傳遞給下一個(gè)組件 在處理管道的下個(gè)組件執(zhí)行之前和之后執(zhí)行一些工作, HttpContxt對(duì)象能跨域請(qǐng)求、響應(yīng)的執(zhí)行
        //-----------------節(jié)選自 Microsoft.AspNetCore.Builder.UseMiddlewareExtensions------------------
         /// <summary>
         /// Adds a middleware type to the application's request pipeline.
         /// </summary>
         /// <typeparam name="TMiddleware">The middleware type.</typeparam>
         /// <param name="app">The <see cref="IApplicationBuilder"/> instance.</param>
         /// <param name="args">The arguments to pass to the middleware type instance's constructor.</param>
         /// <returns>The <see cref="IApplicationBuilder"/> instance.</returns>
         public static IApplicationBuilder UseMiddleware<TMiddleware>(this IApplicationBuilder app, params object[] args)
         {
         return app.UseMiddleware(typeof(TMiddleware), args);
         }
         /// <summary>
         /// Adds a middleware type to the application's request pipeline.
         /// </summary>
         /// <param name="app">The <see cref="IApplicationBuilder"/> instance.</param>
         /// <param name="middleware">The middleware type.</param>
         /// <param name="args">The arguments to pass to the middleware type instance's constructor.</param>
         /// <returns>The <see cref="IApplicationBuilder"/> instance.</returns>
         public static IApplicationBuilder UseMiddleware(this IApplicationBuilder app, Type middleware, params object[] args)
         {
         if (typeof(IMiddleware).GetTypeInfo().IsAssignableFrom(middleware.GetTypeInfo()))
         {
         // IMiddleware doesn't support passing args directly since it's
         // activated from the container
         if (args.Length > 0)
         {
         throw new NotSupportedException(Resources.FormatException_UseMiddlewareExplicitArgumentsNotSupported(typeof(IMiddleware)));
         }
         
         return UseMiddlewareInterface(app, middleware);
         }
         
         var applicationServices = app.ApplicationServices;
         return app.Use(next =>
         {
         var methods = middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public); // 執(zhí)行委托名稱被限制為Invoke/InvokeAsync
         var invokeMethods = methods.Where(m =>
         string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal)
         || string.Equals(m.Name, InvokeAsyncMethodName, StringComparison.Ordinal)
         ).ToArray();
         
         if (invokeMethods.Length > 1)
         {
         throw new InvalidOperationException(Resources.FormatException_UseMiddleMutlipleInvokes(InvokeMethodName, InvokeAsyncMethodName));
         }
         
         if (invokeMethods.Length == 0)
         {
         throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName, InvokeAsyncMethodName, middleware));
         }
         
         var methodInfo = invokeMethods[0];
         if (!typeof(Task).IsAssignableFrom(methodInfo.ReturnType))
         {
         throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNonTaskReturnType(InvokeMethodName, InvokeAsyncMethodName, nameof(Task)));
         }
         
         var parameters = methodInfo.GetParameters();
         if (parameters.Length == 0 || parameters[0].ParameterType != typeof(HttpContext))
         {
         throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName, InvokeAsyncMethodName, nameof(HttpContext)));
         }
         
         var ctorArgs = new object[args.Length + 1];
         ctorArgs[0] = next;
         Array.Copy(args, 0, ctorArgs, 1, args.Length); // 通過(guò)反射形成中間件實(shí)例的時(shí)候,構(gòu)造函數(shù)第一個(gè)參數(shù)被指定為 下一個(gè)中間件的執(zhí)行委托 var instance = ActivatorUtilities.CreateInstance(app.ApplicationServices, middleware, ctorArgs);
         if (parameters.Length == 1)
         {
         return (RequestDelegate)methodInfo.CreateDelegate(typeof(RequestDelegate), instance);
         }
         // 當(dāng)前執(zhí)行委托除了可指定HttpContext參數(shù)以外, 還可以注入更多的依賴參數(shù) 
         var factory = Compile<object>(methodInfo, parameters);
         
         return context => 
         {
         var serviceProvider = context.RequestServices ?? applicationServices;
         if (serviceProvider == null)
         {
         throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider)));
         }
         
         return factory(instance, context, serviceProvider);
         };
         });
         }
         
        //-------------------節(jié)選自 Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder-------------------
        private readonly IList<Func<RequestDelegate, RequestDelegate>> _components = new List<Func<RequestDelegate, RequestDelegate>>();
         
        publicIApplicationBuilder Use(Func<RequestDelegate,RequestDelegate>middleware)
        {
         this._components.Add(middleware);
         return this;
        }
         
         public RequestDelegate Build()
         {
         RequestDelegate app = context =>
         {
         context.Response.StatusCode = 404;
         return Task.CompletedTask;
         };
         
         foreach (var component in _components.Reverse())
         {
         app = component(app);
         }
         
         return app;
         }

        通過(guò)以上代碼我們可以看出:

      1. 注冊(cè)中間件的過(guò)程實(shí)際上,是給一個(gè) Type= List<Func<RequestDelegate, RequestDelegate>> 的容器依次添加元素的過(guò)程;
      2. 容器中每個(gè)元素對(duì)應(yīng)每個(gè)中間件的行為委托Func<RequestDelegate, RequestDelegate> , 這個(gè)行為委托包含2個(gè)關(guān)鍵行為:輸入下一個(gè)中間件的執(zhí)行委托next:RequestDelegate, 完成當(dāng)前中間件的Invoke函數(shù): RequestDelegate;
      3. 通過(guò)build方法完成前后中間件的鏈?zhǔn)絺髦店P(guān)系
      4. 分析源碼:回答上面的問(wèn)題:

        1. 使用反射構(gòu)造中間件的時(shí)候,第一個(gè)參數(shù)Array[0] 是下一個(gè)中間件的執(zhí)行委托
        2. 當(dāng)前中間件執(zhí)行委托 函數(shù)名稱被限制為: Invoke/InvokeAsync, 函數(shù)支持傳入除HttpContext之外的參數(shù)
        3. 按照代碼順序添加進(jìn)入 _components容器, 通過(guò)后一個(gè)中間件的執(zhí)行委托 -----(指向)----> 前一個(gè)中間件的輸入執(zhí)行委托建立鏈?zhǔn)疥P(guān)系。

        附:非標(biāo)準(zhǔn)中間件的用法

        短路中間件、 分叉中間件

        整個(gè)處理管道的形成,存在一些管道分叉或者臨時(shí)插入中間件的行為,一些重要方法可供使用

      5. Use方法是一個(gè)注冊(cè)中間件的簡(jiǎn)便寫(xiě)法
      6. Run方法是一個(gè)約定,一些中間件使用Run方法來(lái)完成管道的結(jié)尾
      7. Map擴(kuò)展方法:請(qǐng)求滿足指定路徑,將會(huì)執(zhí)行分叉管道,強(qiáng)調(diào)滿足 path
      8. MapWhen方法:HttpContext滿足條件,將會(huì)執(zhí)行分叉管道:
      9. UseWhen方法:選擇性的注入中間件 
      10. 總結(jié)

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        ASP.NET Core Middleware的實(shí)現(xiàn)方法詳解

        ASP.NET Core Middleware的實(shí)現(xiàn)方法詳解:概念 ASP.NET Core Middleware是在應(yīng)用程序處理管道pipeline中用于處理請(qǐng)求和操作響應(yīng)的組件。 每個(gè)組件: 在pipeline中判斷是否將請(qǐng)求傳遞給下一個(gè)組件 在處理管道的下個(gè)組件執(zhí)行之前和之后執(zhí)行一些工作, HttpContxt對(duì)象能跨域請(qǐng)求、響應(yīng)的執(zhí)行
        推薦度:
        標(biāo)簽: 方法 詳解 core
        • 熱門(mén)焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門(mén)推薦

        專題
        Top
        主站蜘蛛池模板: 国产午夜精品免费一区二区三区 | 最近更新免费中文字幕大全| 精品久久久久久久免费人妻 | 男男gvh肉在线观看免费| 女人18毛片水最多免费观看| 亚洲视频无码高清在线| 一二三四免费观看在线电影| 亚洲精品乱码久久久久蜜桃| 日本特黄特色aa大片免费| 国产亚洲一卡2卡3卡4卡新区| 国产传媒在线观看视频免费观看| 老子影院午夜伦不卡亚洲| 亚洲国产精品尤物YW在线观看| 羞羞视频网站免费入口| 一本久久a久久精品亚洲| 你是我的城池营垒免费看| 婷婷亚洲综合五月天小说 | 免费无码黄十八禁网站在线观看| 亚洲av无码片在线观看| 国产极品粉嫩泬免费观看| 永久免费无码日韩视频| 亚洲精品无码MV在线观看| 4444www免费看| 亚洲免费综合色在线视频| 亚洲综合精品网站| 老汉精品免费AV在线播放| 亚洲 日韩 色 图网站| 亚洲Av无码乱码在线播放| 人妻免费一区二区三区最新| 亚洲精品免费在线| 国产三级电影免费观看| 野花香高清视频在线观看免费| 亚洲白嫩在线观看| 四虎AV永久在线精品免费观看| 色www永久免费| 亚洲一级特黄特黄的大片| 亚洲伊人久久综合影院| 国产高清不卡免费在线| 人人鲁免费播放视频人人香蕉| 亚洲综合成人网在线观看| 国产大片线上免费看|