ASP.NET Core如何知道一个请求执行了哪些中间件?

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

第一步,添加Nuget包引用

需要添加两个Nuget包分别是:Microsoft.AspNetCore.MiddlewareAnalysis和Microsoft.Extensions.DiagnosticAdapter,前者是分析记录中间件核心代码实现后者是用来接收日志输出的,由于是用的DiagnosticSource方式记录日志,所以需要使用DiagnosticListener对象的SubscribeWithAdapter方法来订阅。
第二步,实现一个分析诊断适配器

这个适配器是为了方便我们把从DiagnosticSource接收到的日志对象输出到控制台,具体代码实现如下
  1.     public class AnalysisDiagnosticAdapter
  2.     {
  3.         private readonly ILogger<AnalysisDiagnosticAdapter> _logger;
  4.         public AnalysisDiagnosticAdapter(ILogger<AnalysisDiagnosticAdapter> logger)
  5.         {
  6.             _logger = logger;
  7.         }
  8.         [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareStarting")]
  9.         public void OnMiddlewareStarting(HttpContext httpContext, string name, Guid instance, long timestamp)
  10.         {
  11.             _logger.LogInformation($"中间件-启动: '{name}'; Request Path: '{httpContext.Request.Path}'");
  12.         }
  13.         [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareException")]
  14.         public void OnMiddlewareException(Exception exception, HttpContext httpContext, string name, Guid instance, long timestamp, long duration)
  15.         {
  16.             _logger.LogInformation($"中间件-异常: '{name}'; '{exception.Message}'");
  17.         }
  18.         [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareFinished")]
  19.         public void OnMiddlewareFinished(HttpContext httpContext, string name, Guid instance, long timestamp, long duration)
  20.         {
  21.             _logger.LogInformation($"中间件-结束: 耗时[{duration/10000}] '{name}'; Status: '{httpContext.Response.StatusCode}'");
  22.         }
  23.     }
复制代码
第三步,注册相关服务来启用分析中间件的功能


  • 注册中间件分析服务
  1. var builder = WebApplication.CreateBuilder(args);
  2. builder.Services.AddMiddlewareAnalysis();
复制代码

  • 订阅我们的分析诊断适配器
  1. var listener = app.Services.GetRequiredService<DiagnosticListener>();
  2. var observer = ActivatorUtilities.CreateInstance<AnalysisDiagnosticAdapter>(app.Services);
  3. using var disposable = listener.SubscribeWithAdapter(observer);
复制代码
这样基本就完成了分析记录中间件的功能,启动程序看看效果

日志已经成功的输出到我们的控制台了,不过才四个中间件,应该不止这么少的,再在注册中间件分析服务哪里添加一句代码
  1. var builder = WebApplication.CreateBuilder(args);
  2. // 新增的下面这句代码
  3. builder.Services.Insert(0, ServiceDescriptor.Transient<IStartupFilter, AnalysisStartupFilter>());
  4. builder.Services.AddMiddlewareAnalysis();
复制代码
现在再来看看效果,发现变成8个中间件了多了四个

在Release模式编译后,运行发现中间件的执行效率非常高,几乎不占用时间

异常记录这里就不放图了,有兴趣的朋友自己去试试。
简单三步就可以知道一个请求到底执行了哪些中间件还是挺方便的。想知道实现原理可以去看看Microsoft.AspNetCore.MiddlewareAnalysis这个库,一共才四个文件看起来不费事。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表