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


    第一步,添加Nuget包引用

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

    第二步,实现一个分析诊断适配器

    这个适配器是为了方便我们把从DiagnosticSource接收到的日志对象输出到控制台,具体代码实现如下

        public class AnalysisDiagnosticAdapter
        {
            private readonly ILogger _logger;
            public AnalysisDiagnosticAdapter(ILogger logger)
            {
                _logger = logger;
            }
    
            [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareStarting")]
            public void OnMiddlewareStarting(HttpContext httpContext, string name, Guid instance, long timestamp)
            {
                _logger.LogInformation($"中间件-启动: '{name}'; Request Path: '{httpContext.Request.Path}'");
            }
    
            [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareException")]
            public void OnMiddlewareException(Exception exception, HttpContext httpContext, string name, Guid instance, long timestamp, long duration)
            {
                _logger.LogInformation($"中间件-异常: '{name}'; '{exception.Message}'");
            }
    
            [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareFinished")]
            public void OnMiddlewareFinished(HttpContext httpContext, string name, Guid instance, long timestamp, long duration)
            {
                _logger.LogInformation($"中间件-结束: 耗时[{duration/10000}] '{name}'; Status: '{httpContext.Response.StatusCode}'");
            }
        }

    第三步,注册相关服务来启用分析中间件的功能

    1. 注册中间件分析服务
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddMiddlewareAnalysis();
    1. 订阅我们的分析诊断适配器
    var listener = app.Services.GetRequiredService();
    var observer = ActivatorUtilities.CreateInstance(app.Services);
    using var disposable = listener.SubscribeWithAdapter(observer);

    这样基本就完成了分析记录中间件的功能,启动程序看看效果

    日志已经成功的输出到我们的控制台了,不过才四个中间件,应该不止这么少的,再在注册中间件分析服务哪里添加一句代码

    var builder = WebApplication.CreateBuilder(args);
    // 新增的下面这句代码
    builder.Services.Insert(0, ServiceDescriptor.Transient());
    builder.Services.AddMiddlewareAnalysis();

    现在再来看看效果,发现变成8个中间件了多了四个

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

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


    __EOF__

  • 本文作者: Ax0ne
  • 本文链接: https://www.cnblogs.com/Ax0ne/p/17300692.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    后端Long型数据传到前端js后精度丢失的问题
    【毕业季·进击的技术er】业务和技术同等重要 · 职场人工作一年的经验之谈
    Nginx (1):nginx虚拟主机配置
    Download Quartz持久化数据库下载地址
    英特尔软硬优化,赋能东软加速智慧医疗时代到来
    开年拿下3个offer,字节跳动大佬的算法刷题笔记真香
    【优化调度】基于粒子群实现并网模型下微电网的经济调度优化附matlab代码
    HTML期末作业-基于HTML+CSS+JavaScript制作学生信息管理系统模板
    自媒体新人,如何快速积累粉丝,我的业余Python能帮助我干些什么
    go编程中接口(interface)用法
  • 原文地址:https://www.cnblogs.com/Ax0ne/p/17300692.html