• 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毕业设计鞍山丘比特房屋租赁管理系统Mybatis+系统+数据库+调试部署
    Pytest系列(31) - config.cache 使用
    【公式输入】 latex和markdown支持的公式写法整理
    2023年中国工业炉分类、产量及市场规模分析[图]
    从零开始C语言精讲篇7:数据的存储
    JavaScript 62 JavaScript 版本 62.3 JavaScript ES6
    #ubuntu# #git# repository git config --global --add safe.directory
    专利终止怎么恢复 ?
    c语言数据结构,你可能还不知道的顺序表
    在Java中使用Apache Kafka进行消息队列处理
  • 原文地址:https://www.cnblogs.com/Ax0ne/p/17300692.html