.Net Core實現記錄接口執行時間的中間件


  項目中有時接口訪問時間過長,但是通過瀏覽器F12查看時,接口訪問時間很正常,所以就很奇怪,於是寫一個中間件,記錄所有接口訪問時間的中間件。

一、中間件

  中間件是應用程序處理管道中的組件,用來處理請求和響應。如下圖,請求來之后,第一個中間件處理,處理完后調用下一個中間件(當然也可以選擇不調用下一個中間件),這樣形成一個請求處理管道。每一個中間件通過一個名為RequestDelegate的委托調用下一個中間件。當所有的中間件處理完請求后,再依次返回Response。

  微軟提供的中間件有:Authentication(認證)、Cors(跨域資源共享)、Session StaticFiles(靜態文件)、Caching(緩存)、MVC等等。

二、實現記錄接口執行時間中間件

  首先中間件不需要繼承什么接口,也沒有什么限制。我們可以仿照微軟提供的中間件起名建一個 CalculateExecutionTimeMiddleware和 CalculateExecutionTimeMiddlewareExtensions,如果中間件中涉及配置相關的參數,可以建一個Option。此中間件沒有配置參數就沒有Option。還有就是此中間件必須放在第一位,這樣才能盡可能記錄請求時間。

 public class CalculateExecutionTimeMiddleware
    {
        private readonly RequestDelegate _next;//下一個中間件
        private readonly ILogger _logger;
        Stopwatch stopwatch;
        public CalculateExecutionTimeMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
        {
            if (next == null)
            {
                throw new ArgumentNullException(nameof(next));
            }
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }
            this._next = next;
            _logger = loggerFactory.CreateLogger<CalculateExecutionTimeMiddleware>();
        }

        public async Task Invoke(HttpContext context)
        {
            stopwatch = new Stopwatch();
            stopwatch.Start();//在下一個中間價處理前,啟動計時器 await _next.Invoke(context);

            stopwatch.Stop();//所有的中間件處理完后,停止秒表。
            _logger.LogInformation($@"接口{context.Request.Path}耗時{stopwatch.ElapsedMilliseconds}ms");
        }
    }

 拓展方法 將中間件加入到請求處理通道中。

 public static class CalculateExecutionTimeMiddlewareExtensions
    {
        public static IApplicationBuilder UseCalculateExecutionTime(this IApplicationBuilder app)
        {
            if (app == null)
            {
                throw new ArgumentNullException(nameof(app));
            }
            return app.UseMiddleware<CalculateExecutionTimeMiddleware>(); 
        }
    }

使用:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IDataProtectionProvider dataProtectionProvider)
        {
            app.UseCalculateExecutionTime();//只需在此添加 if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseSession();
            app.UseMvc();
        }

三、總結

  此中間件只記錄了程序處理請求的時間,不能記錄網絡傳輸時間,所以記錄的時間比瀏覽器中的時間短一點,但不影響我們找長時間相應的接口。源碼在https://github.com/MicroHeartWangZheng/ExecutionTime

  


免責聲明!

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



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