• 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 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    基于java web技术的班级同学录网站-计算机毕业设计
    大学生HTML作业节日网页 HTML作业节日文化网页期末作业 html+css+js节日网页 HTML学生节日介绍 HTML学生作业网页视频
    力扣:123.买卖股票的最佳时机III
    分布式链路追踪-skywalking基础
    『牛客|每日一题』模板队列
    【51单片机】6-点亮第一个LED灯
    BL808:【M1s DOCK开发板】与LVGL 使用体验
    一幅长文细学JavaScript(二)——一幅长文系列
    洛谷 P2023 [AHOI2009] 维护序列(线段树)
    月子会所管理系统| 月子会所小程序| 数字化门店转型
  • 原文地址:https://www.cnblogs.com/Ax0ne/p/17300692.html