zoukankan      html  css  js  c++  java
  • .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>(); 
            }
        }

    使用:

            {
                app.UseCalculateExecutionTime();//只需在此添加
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseHsts();
                }
                app.UseHttpsRedirection();
                app.UseSession();
                app.UseMvc();
            }

    三、总结

      此中间件只记录了程序处理请求的时间,不能记录网络传输时间,所以记录的时间比浏览器中的时间短一点,但不影响我们找长时间相应的接口。源码在https://github.com/MicroHeartWangZheng/ExecutionTime

    文章转自:.Net Core实现记录接口执行时间的中间件 - MicroHeart! - 博客园 (cnblogs.com)

  • 相关阅读:
    nginx 禁止访问某个目录
    ssh 无法链接的解决思路
    linux 时间修改(同步到时间服务器)
    BitNami Gitlab的重启问题
    gitlab push时报错
    VirtualBox 安装centos后无法上网
    VirtualBox 创建64位系统的问题
    NOIP2010 题解
    NOIP2011 题解
    NOIP2012 题解
  • 原文地址:https://www.cnblogs.com/dongh/p/15470938.html
Copyright © 2011-2022 走看看