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

科技资讯 投稿 7200 0 评论

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

第一步,添加Nuget包引用

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

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

    public class AnalysisDiagnosticAdapter
    {
        private readonly ILogger<AnalysisDiagnosticAdapter> _logger;
        public AnalysisDiagnosticAdapter(ILogger<AnalysisDiagnosticAdapter> 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}'";
        }
    }

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

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

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

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

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

简单三步就可以知道一个请求到底执行了哪些中间件还是挺方便的。想知道实现原理可以去看看Microsoft.AspNetCore.MiddlewareAnalysis这个库,一共才四个文件看起来不费事。

编程笔记 » ASP.NET Core如何知道一个请求执行了哪些中间件

赞同 (31) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽