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

第一步,添加Nuget包引用

需要添加两个Nuget包分别是:Microsoft.AspNetCore.MiddlewareAnalysisMicrosoft.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}'");
        }
    }

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

  1. 注册中间件分析服务
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);

这样基本就完成了分析记录中间件的功能,启动程序看看效果
ASP.NET Core如何知道一个请求执行了哪些中间件?

日志已经成功的输出到我们的控制台了,不过才四个中间件,应该不止这么少的,再在注册中间件分析服务哪里添加一句代码

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

现在再来看看效果,发现变成8个中间件了多了四个
ASP.NET Core如何知道一个请求执行了哪些中间件?

在Release模式编译后,运行发现中间件的执行效率非常高,几乎不占用时间
ASP.NET Core如何知道一个请求执行了哪些中间件?

异常记录这里就不放图了,有兴趣的朋友自己去试试。
简单三步就可以知道一个请求到底执行了哪些中间件还是挺方便的。想知道实现原理可以去看看Microsoft.AspNetCore.MiddlewareAnalysis这个库,一共才四个文件看起来不费事。

原文链接:https://www.cnblogs.com/Ax0ne/p/17300692.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core如何知道一个请求执行了哪些中间件? - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • C#中Byte[]和String之间转换的方法

    当需要处理二进制数据时,我们通常会用到Byte[]类型,而处理文本时则使用String类型。在C#中,Byte[]和String之间的相互转换可以通过以下方法进行。 Byte[] 转 String 1. 直接将 Byte[] 转为 String 可以使用Encoding类提供的GetString方法将Byte[]直接转为String。 byte[] byte…

    C# 2023年6月1日
    00
  • C#数组排序的两种常用方法

    下面是关于C#数组排序的两种常用方法的完整攻略。 方法一:使用Array.Sort方法排序 Array.Sort是.NET Framework中的一个静态方法,可以对数组进行升序或降序排列。这个方法的使用非常简单,直接调用即可。 步骤 定义一个数组 int[] numbers = { 5, 2, 1, 3, 4 }; 使用Array.Sort方法对数组进行排…

    C# 2023年6月1日
    00
  • WPF+ASP.NET SignalR实现动态折线图的绘制

    下面是详细的攻略: 简介 本文介绍如何使用 WPF 和 ASP.NET SignalR 实现动态折线图的绘制。WPF 是一个用于创建 Windows 应用程序的 UI 框架,而 ASP.NET SignalR 是一个用于实现实时应用程序的框架,两者结合可以实现实时折线图的绘制。 准备工作 在开始实现动态折线图之前,我们需要准备以下工具: Visual Stu…

    C# 2023年6月3日
    00
  • 详解WPF中的对象资源

    下面就详细讲解一下WPF中的对象资源的使用攻略。 局部对象资源 WPF中的局部对象资源是指在某个特定元素的范围内定义的资源,只有在该元素及其子元素中才能够访问到。局部对象资源可以使用x:Key属性进行引用。 下面是一个局部对象资源的示例: <Window x:Class="WpfApp1.MainWindow" xmlns=&quo…

    C# 2023年6月1日
    00
  • c#反射机制学习和利用反射获取类型信息

    C#反射机制学习和利用反射获取类型信息 反射是C#语言中的一种高级特性,它允许程序在运行时查看和操作代码中的类型、属性和方法。开发人员可以利用反射获取类型信息,并创建对象、调用方法或访问属性,这使得程序的代码更加动态和灵活。 反射的基本概念 类型、程序集和命名空间 在C#中,类型是指类、接口、枚举、结构体等定义。程序集是一组关联的类型,可以打包为DLL或EX…

    C# 2023年5月15日
    00
  • c# 接口使用实例

    下面是关于“C#接口使用实例”的完整攻略,包含两个示例。 1. 接口简介 在C#中,接口是一种定义了一组方法、属性和事件的类型,但没有提供实现的类型。接口可以被其他类型实现,从而使它们能够使用接口中定义的方法、属性和事件。接口可以用于实现多态性,从而提高代码的灵活性和可维护性。 2. 接口的使用 以下是一个示例,演示如何定义和实现一个接口: public i…

    C# 2023年5月15日
    00
  • C#数据结构之最小堆的实现方法

    C#数据结构之最小堆的实现方法 什么是最小堆? 最小堆是一种特殊的二叉树结构,它满足以下两个条件: 是一个完全二叉树。 任意节点值不大于其子节点的值。 最小堆的根节点是整个堆中最小的元素,而它的左右子节点也必定是整个堆中数值最小的元素。 最小堆的实现 实现最小堆需要用到数组和指针,以下是一个简单的最小堆类。 public class MinHeap<T…

    C# 2023年6月7日
    00
  • C#网页信息采集方法汇总

    标题:C#网页信息采集方法汇总 介绍 C#是一种面向对象的编程语言,在网络爬虫中有广泛的应用。本文将介绍C#网页信息采集的基础知识和常用的方法,让大家快速入门。 基础知识 HTML和CSS 网页是由HTML和CSS构成的,HTML用来定义网页的内容结构,CSS用来定义网页的样式和布局。在进行网页信息采集前,需要了解HTML和CSS的基础知识。 HTTP协议 …

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部