1. 程式人生 > >記錄介面執行時間的中介軟體

記錄介面執行時間的中介軟體

  專案中有時介面訪問時間過長,但是通過瀏覽器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();
        }

三、總結