欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

记录接口执行时间的中间件

程序员文章站 2024-01-13 22:51:04
项目中有时接口访问时间过长,但是通过浏览器F12查看时,接口访问时间很正常,所以就很奇怪,于是写一个中间件,记录所有接口访问时间的中间件。 一、中间件 中间件是应用程序处理管道中的组件,用来处理请求和响应。如下图,请求来之后,第一个中间件处理,处理完后调用下一个中间件(当然也可以选择不调用下一个中间 ......

  项目中有时接口访问时间过长,但是通过浏览器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