如何给asp.net core写个中间件记录接口耗时

来源:脚本之家  责任编辑:小易  

国家提出了中国通信产业提速降费举措,是利国利民的大好事,全国人民群众欢欣鼓舞。中国三大通信运营商都积极支持,并且特别提出从2017年9月1日起取消原有移动电话国内漫游费,让利于民众,但是如何办理取消原定的本地,省内,国内长途漫游费,?是否需要本人专门去申请办理,?还是三大运营商届时自动全面办理?可就不得而知。但是,根据这些年以来,三大运营商的服务,一般百姓都不敢相信三大运营商最近来发出的高调承诺,其原因是前些年,民众被三大运营商的的营销策略忽悠得很是一头雾水。比如:营销人员推比的什么适应于不同人群的108套餐,88套餐,68套餐,有的是在活动期间用多少,返多少,有的是返50,返30,等,等,等

Intro

写接口的难免会遇到别人说接口比较慢,到底慢多少,一个接口服务器处理究竟花了多长时间,如果能有具体的数字来记录每个接口耗时多少,别人再说接口慢的时候看一下接口耗时统计,如果几毫秒就处理完了,对不起这锅我不背。

我来讲一个,小的时候,家里穷,住在平房,那个时候养个宠物很简单,我就养了一只猫。那个时候不像现在有那么多驱虫的药,没有,但我家的猫身上有虫子,跳蚤,咬人。我妈就跟我商量用杀蚊子的药给猫洗洗澡,当时我们做了措施的,把猫头用布缠起来,就留嘴巴,就给它洗完了,也吹干了,然后就把它放开了。放开后,它一直舔它的毛,我当时以为反正洗干净了,不怕,但是到了下午它出去溜了一圈以后,口吐白沫,站不起来,我妈说,坏了,中毒了。到了晚上,我发现它跑到了我的床上,也就是它最爱的地方,它很开心的玩起了我的文具盒,我以为它好了,康复了,开心的陪它玩了一会,后来我去吃晚饭了,吃完饭,我急忙去看它,这时它已经走了,身体还很软

中间件实现

asp.net core 的运行是一个又一个的中间件来完成的,因此我们只需要定义自己的中间件,记录请求开始处理前的时间和处理结束后的时间,这里的中间件把请求的耗时输出到日志里了,你也可以根据需要输出到响应头或其他地方。

“雪橇三傻”萨摩耶、哈士奇、阿拉斯加都被大家所熟知,虽然都是拆家能手,但还是深受广大铲屎官的喜爱。然而,“三傻”中的哈士奇和阿拉斯加因为外形相似,常常让一些不熟悉它们的人傻傻分不清楚,其实它们的区别还是很多的,今天我们就来总结一下二者的区别,帮助大家辨别:①身材如果把阿拉和二哈放到一起对比一下,大家就很容易看出区别。阿拉斯加属于大型犬,而哈士奇属于中型犬。成犬阿拉斯加要比成犬哈士奇平均高出10cm左右,体重重10kg左右。大哥和蠢蠢的小跟班即视感有木有!阿拉斯加(左)哈士奇(右)②瞳孔颜色第一种辨别方法对于我们在生活中区分阿拉和二哈是非常有用的,但是随着云养的流行,怎么才能单从图片一眼就区分出

public static class PerformanceLogExtension { public static IApplicationBuilder UsePerformanceLog(this IApplicationBuilder applicationBuilder) { applicationBuilder.Use(async (context, next) => { var profiler = new StopwatchProfiler(); profiler.Start(); await next(); profiler.Stop(); var logger = context.RequestServices.GetService<ILoggerFactory>() .CreateLogger("PerformanceLog"); logger.LogInformation("TraceId:{TraceId}, RequestMethod:{RequestMethod}, RequestPath:{RequestPath}, ElapsedMilliseconds:{ElapsedMilliseconds}, Response StatusCode: {StatusCode}", context.TraceIdentifier, context.Request.Method, context.Request.Path, profiler.ElapsedMilliseconds, context.Response.StatusCode); }); return applicationBuilder; } }

我喜欢吃土豆条做的土豆饼土豆2个,葱叶五六根,鸡蛋俩个,面半碗,盐三勺左右把土豆擦好放盆里,加俩鸡蛋,葱花,也可根据自己口味加点火腿丝或者胡萝卜又或者尖椒……然后是三勺盐,还有面粉,最后搅拌韵搅拌匀后的效果下锅,用勺子把土豆饼弄园弄扁制作过程图成品图

中间件配置

在 Startup 里配置请求处理管道,示例配置如下:

app.UsePerformanceLog(); app.UseAuthentication(); app.UseMvc(routes => { // ... }); // ...

示例

在日志里按 Logger 名称 “PerformanceLog” 搜索日志,日志里的 ElapsedMilliseconds 就是对应接口的耗时时间,也可以按 ElapsedMilliseconds 范围来搜索,比如筛选耗时时间大于 1s 的日志

Memo

这个中间件比较简单,只是一个处理思路。

大型应用可以用比较专业的 APM 工具,最近比较火的 Skywalking 项目可以了解一下,支持 .NET Core, 详细信息参考: https://github.com/SkyAPM/SkyAPM-dotnet

Reference

https://github.com/WeihanLi/ActivityReservation

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

net core支持中间件开发吗

ASP.NET Core开发,开发并使用中间件(Middleware)。

中间件是被组装成一个应用程序管道来处理请求和响应的软件组件。

每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组分在管道中调用之后执行特定操作。

具体如图:

开发中间件(Middleware)

今天我们来实现一个记录ip 的中间件。

1.新建一个asp.net core项目,选择空的模板。

然后为项目添加一个 Microsoft.Extensions.Logging.Console

NuGet 命令行 ,请使用官方源。

Install-Package Microsoft.Extensions.Logging.Console -Pre

2.新建一个类: RequestIPMiddleware.cs

复制代码

public class RequestIPMiddleware

{

private readonly RequestDelegate _next;

private readonly ILogger _logger;

public RequestIPMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)

{

_next = next;

_logger = loggerFactory.CreateLogger<RequestIPMiddleware>();

}

public async Task Invoke(HttpContext context)

{

_logger.LogInformation("User IP: " + context.Connection.RemoteIpAddress.ToString());

await _next.Invoke(context);

}

}

复制代码

3.再新建一个:RequestIPExtensions.cs

复制代码

public static class RequestIPExtensions

{

public static IApplicationBuilder UseRequestIP(this IApplicationBuilder builder)

{

return builder.UseMiddleware<RequestIPMiddleware>();

}

}

复制代码

这样我们就编写好了一个中间件。

使用中间件(Middleware)

1.使用

在 Startup.cs 添加 app.UseRequestIP()

复制代码

public void Configure(IApplicationBuilder app, ILoggerFactory loggerfactory)

{

loggerfactory.AddConsole(minLevel: LogLevel.Information);

app.UseRequestIP();//使用中间件

app.Run(async (context) =>

{

await context.Response.WriteAsync("Hello World!");

});

}

复制代码

然后运行程序,我选择使用Kestrel 。

访问:http://localhost:5000/

成功运行。

这里我们还可以对这个中间件进行进一步改进,增加更多的功能,如*访问等。

终于知道什么情况下需要实现.NET Core中的IOptions接口

我们所说的ApplicationBuilder是对所有实现了IApplicationBuilder接口的所有类型及其对象的统称。注册到WebHostBuilder上的启动类型具有一个用于管道定值的Configure方法,它利用作为参数的ApplicationBuilder对象进行中间件的注册。由于ApplicationBuilder与组成管道的中间件具有直接的关系,所以我们得先来说说中间件在管道中究竟体现为一个怎样的对象。中间件在请求处理流程中体现为一个类型为Func的委托对象,对于很多刚刚接触请求处理管道的读者朋友们来说,可能一开始对此有点难以理解,所以容来略作解释。我们上面已经提到过RequestDelegate这么一个委托,它相当于一个Func对象,该委托对象表示针对提供的HttpContext所做进行一项处理操作,这项操作代表某个中间件针对请求的处理。那为何我们不直接用一个RequestDelegate对象来表示一个中间件,而将它表示成一个Func对象呢?在大部分应用中,我们会针对具体的请求处理需求注册多个不同的中间件,这些中间件按照注册时间的先后顺序进行排列进而构成我们所谓的请求处理管道。对于某个中间件来说,在它完成了自身的请求处理任务之后,需要将请求传递给下一个中间件作后续的处理。Func中作为输入参数的RequestDelegate对象代表一个委托链,体现了后续中间件对请求的处理,当前中间件将自身实现的请求处理任务添加到这个委托链中,而返回RequestDelegate对象代表最新的委托链。以右图所示的管道为例,如果用一个Func来表示中间件B,那么作为输入参数的RequestDelegate对象代表的是C对请求的处理操作,而返回值则代表B和C先后对请求处的处理操作。如果一个Func代表第一个从服务器接收请求的中间件(比如A),那么执行该委托对象返回的RequestDelegate实际上体现了整个管道对请求的处理。在对中间件有了充分的了解之后,我们来看看用于注册中间件的IApplicationBuilder接口的定义。如下所示的是经过裁剪后的IApplicationBuilder接口的定义,我们只保留了两个核心的方法,其中Use方法实现了针对中间件的注册,另一个Build方法则将所有注册的中间件转换成一个RequestDelegate对象。1:publicinterfaceIApplicationBuilder2:{3:RequestDelegateBuild();4:IApplicationBuilderUse(Funcmiddleware);5:}从编程便利性考虑,很多预定义的中间件都具有用于注册的扩展方法,比如我们调用扩展方法UseStaticFiles来注册处理静态文件请求的中间件。对于我们演示的发布图片的应用来说,它也是通过调用一个具有如下定义的扩展方法UseImages来注册处理图片请求的中间件。1:publicstaticclassApplicationBuilderExtensions2:{3:publicstaticIApplicationBuilderUseImages(thisIApplicationBuilderapp,stringdirectory)4:{5:Funcmiddleware=next=>6:{7:returncontext=>8:{9:stringfileName=context.Request.Url.LocalPath.TrimStart('/');10:if(string.IsNullOrEmpty(Path.GetExtension(fileName)))11:{12:fileName+=".jpg";13:}14:fileName=Path.Combine(directory,fileName);15:context.Response.WriteFile(fileName,"image/jpg");16:returnnext(context);17:};18:};19:returnapp.Use(middleware);20:}21:}ASP.NETCore默认使用的是一个类型为ApplicationBuilder的对象来注册中间件,我们采用如下的代码片断来模拟它的实现逻辑。我们采用一个List>对象来存放所有注册的中间件,并调用Aggregate方法将它转换成一个RequestDelegate对象。1:publicclassApplicationBuilder:IApplicationBuilder2:{3:privateIList>middlewares=newList>();4:5:publicRequestDelegateBuild()6:{7:RequestDelegateseed=context=>Task.Run(()=>{});8:returnmiddlewares.Reverse().Aggregate(seed,(next,current)=>current(next));9:}10:11:publicIApplicationBuilderUse(Funcmiddleware)12:{13:middlewares.Add(middleware);14:returnthis;15:}16:}ASP.NETCore并不会直接创建ApplicationBuilder对象来注册中间件,而是利用对应的工厂来创建它。创建爱你ApplicationBuilder的工厂通过接口IApplicationBuilderFactory表示,在模拟的管道中我们将这个接口简化成如下的形式,该接口的默认实现者ApplicationBuilderFactory会直接创建一个ApplicationBuilder类型的对象。1:publicinterfaceIApplicationBuilderFactory2:{3:IApplicationBuilderCreateBuilder();4:}5:6:publicclassApplicationBuilderFactory:IApplicationBuilderFactory7:{8:publicIApplicationBuilderCreateBuilder()9:{10:returnnewApplicationBuilder();11:}12:}

  • 本文相关:
  • 详解在asp.net core 中使用cookie中间件
  • 详解asp.net core 中间件之压缩、缓存
  • 浅谈asp.net core 中间件详解及项目实战
  • asp.net core 通过中间件防止图片盗链的实例
  • 浅谈asp.net core中间件实现分布式 session
  • 浅谈asp.net core 2.0 带初始参数的中间件(译)
  • asp.net core 2.0 带初始参数的中间件问题及解决方法
  • 浅谈asp.net core 2.0 中间件(译)
  • asp.net core中间件设置教程(7)
  • .net使用.net core cli开发应用程序
  • silverlight融合ajax实现前后台数据交互
  • asp.net coolite tablepanel使用
  • .net 4.5 异步io 相关实例
  • asp.net 5中使用azuread实现单点登录
  • 用类的继承关系(重写父类的方法)实现简易后台代码模板
  • asp.net 分页潜谈
  • asp.net页面按钮单击事件失效的解决方法
  • c#精髓 gridview72大绝技 学习gridview的朋友必看
  • server application unavailable出现的原因及解决方案小结
  • net core支持中间件开发吗
  • 终于知道什么情况下需要实现.NET Core中的IOptions...
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved