ASP.NET Core如何知道一个请求执行了哪些中间件?
2023/4/10 1:22:23
本文主要是介绍ASP.NET Core如何知道一个请求执行了哪些中间件?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
第一步,添加Nuget包引用
需要添加两个Nuget包分别是:Microsoft.AspNetCore.MiddlewareAnalysis
和Microsoft.Extensions.DiagnosticAdapter
,前者是分析记录中间件核心代码实现后者是用来接收日志输出的,由于是用的DiagnosticSource方式记录日志,所以需要使用DiagnosticListener对象的SubscribeWithAdapter方法来订阅。
第二步,实现一个分析诊断适配器
这个适配器是为了方便我们把从DiagnosticSource接收到的日志对象输出到控制台,具体代码实现如下
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();
- 订阅我们的分析诊断适配器
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个中间件了多了四个
在Release模式编译后,运行发现中间件的执行效率非常高,几乎不占用时间
异常记录这里就不放图了,有兴趣的朋友自己去试试。
简单三步就可以知道一个请求到底执行了哪些中间件还是挺方便的。想知道实现原理可以去看看Microsoft.AspNetCore.MiddlewareAnalysis这个库,一共才四个文件看起来不费事。
这篇关于ASP.NET Core如何知道一个请求执行了哪些中间件?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#