<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
        主站蜘蛛池模板: 成人毛片18女人毛片免费视频未| 国产成人综合亚洲AV第一页 | 好吊妞在线成人免费| 亚洲AV成人精品网站在线播放| 久久精品无码免费不卡| 久久精品亚洲男人的天堂| 久久亚洲精品国产精品| 在线观看免费视频资源| 亚洲国产精品线观看不卡| 可以免费看的卡一卡二| 亚洲香蕉网久久综合影视| 国产婷婷综合丁香亚洲欧洲| 中文字幕免费观看视频| 亚洲熟妇无码AV在线播放| 国产婷婷成人久久Av免费高清| 亚洲精品狼友在线播放| 99久久国产免费中文无字幕 | 亚洲国产成人无码AV在线| 国产麻豆免费观看91| 亚洲av无码国产精品夜色午夜 | 91大神免费观看| 亚洲熟女www一区二区三区| 黄色片免费在线观看| 久久久久亚洲AV无码永不| 美女视频黄的全免费视频| 国产亚洲欧美日韩亚洲中文色| 免费在线观看一级片| 亚洲视频网站在线观看| h片在线播放免费高清 | 成人a免费α片在线视频网站 | 青青操免费在线观看| 免费**毛片在线播放直播| sihu国产精品永久免费| 久久精品国产亚洲av影院| 天堂在线免费观看中文版| 国产日韩精品无码区免费专区国产| 亚洲人成在线播放网站岛国| 最新中文字幕电影免费观看| 高清免费久久午夜精品| 亚洲美女中文字幕| 亚洲AV无码成H人在线观看|