当前位置: 主页 > 观点 > 内容页

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

2023-04-09 19:41:04 来源:博客园


(相关资料图)

第一步,添加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}"");        }    }
第三步,注册相关服务来启用分析中间件的功能注册中间件分析服务
var builder = WebApplication.CreateBuilder(args);builder.Services.AddMiddlewareAnalysis();
订阅我们的分析诊断适配器
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这个库,一共才四个文件看起来不费事。

标签:

发展
天天热讯:百利班登录平台
(资料图)您好,现在渔夫来为大家解答以上的问题。百利班登录平台相信很多小伙伴还不知道,现在让我们一起来看看吧!1、那里的老师基本上都有
速读:贵州广电网络电视只显示小屏幕不能全屏播放(贵州广电网络电视)
(相关资料图)您好,现在渔夫来为大家解答以上的问题。贵州广电网络电视只显示小屏幕不能全屏播放,贵州广电网络电视相信很多小伙伴还不知道,
天天速递!《草虫村教案》
您好,现在渔夫来为大家解答以上的问题。《草虫村教案》相信很多小伙伴还不知道,现在让我们一起来看看吧!(资料图片仅供参考)1、1.正确读写