DotNetCore跨平台~聊聊中間件


回到目錄

在進行.net core平台之后,我們如果希望在請求過程中添加一些事件是非常容易的,你可以把這些事件做成一個中間件Middleware,然后這些中間件就會以Http pipeline的管道方式進行相應,並且它們就像是一個職責鏈,從你定義的第一個中間件開始,一個一個向下傳遞,直到最后一個中間件完成為止!

前幾天我寫了在.net core里實現模塊化服務,DotNetCore跨平台~組件化時代來了 主要是將我們定義的組件添加到IServiceCollection集合里,然后在程序啟動后去注冊它們,而今天要說的Middleware用到的是IApplicationBuilder,它在程序啟動后,加載與http請求相關的組件,這些組件以Pipeline的形式進行處理,也就是我們所說的中間件,下面我來帶大家實現一個最簡單的Middleware!

從網上找的圖,挺形象

圖中記錄了一個請求進來,經過各個中間件的處理,最后逐個響應,下面我們來看一下簡單的代碼實現,和服務組件化一樣,也是一個實現,一個擴展方法的調用,最后在startup里去使用它。

大叔Lind.DotNetCore框架里的Middleware

ResponseTimeMiddleware的實現

    /// <summary>
    /// 響應時間的中間件
    /// </summary>
    public class ResponseTimeMiddleware
    {
        private readonly RequestDelegate _next;
        public ResponseTimeMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Console.WriteLine("ResponseTimeMiddleware...");
            await _next.Invoke(context);
            sw.Stop();
            Console.WriteLine($"頁面響應時間為:{sw.ElapsedMilliseconds}ms");
        }

    }

擴展方法去封裝它,以便於其它地方去使用它

    /// <summary>
    /// Lind.DotNetCore.Middleware擴展方法
    /// </summary>
    public static class MiddlewareExtensions
    {
        public static IApplicationBuilder UseResponseTime(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<ResponseTimeMiddleware>();
        }

        public static IApplicationBuilder UseRequestKey(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RequestKeyMiddleware>();
        }

        public static IApplicationBuilder UseAuthorizationOperation(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<AuthorizationOperationMiddleware>();
        }

    }

最后在startup里使用它,注意是在AddMvc方法前面,要不然對你的mvc,api是無效的,呵呵!

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseAuthorizationOperation(); app.UseResponseTime(); app.UseRequestKey();
            app.UseStaticHttpContext();
            app.UseMvc();

事實上,今天的中間件是.net core里非常大的亮點,其實早就應該寫這篇文章了,呵呵!

感謝各位的閱讀!

回到目錄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM