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#中如何使用redis

    下面是使用C#连接Redis的完整攻略: 准备工作 在开始使用C#连接Redis之前,需要确保机器上已经安装了Redis。如果没有安装Redis,可以从https://redis.io/download这个官网下载Redis并安装。 安装完成后,需要启动Redis服务,可以通过命令行输入 redis-server 来启动Redis服务。 在C#中连接Redi…

    C# 2023年6月6日
    00
  • c# 模拟串口通信 SerialPort的实现示例

    下面是关于“C#模拟串口通信SerialPort的实现示例”的攻略: 第一步:准备工作 在实现具体的代码之前,需要先准备一些基础工作。包括: 准备一个模拟串口的环境。这可以通过安装一个虚拟串口软件来实现(如“虚拟串口驱动程序”) 引入SerialPort类。在程序中需要使用System.IO.Ports命名空间,可以通过在程序中添加以下引用来实现:using…

    C# 2023年6月6日
    00
  • asp.net GridView模板列中实现选择行功能

    要实现在GridView模板列中选择行的功能,可以采用以下步骤: 1.在GridView中添加模板列,并在模板列中添加一个复选框控件 <asp:GridView ID="GridView1" runat="server"> <Columns> <asp:TemplateField> …

    C# 2023年5月31日
    00
  • C# 根据字符串生成二维码的实例代码

    下面是针对“C# 根据字符串生成二维码的实例代码”的完整攻略,内容包括以下几个方面:安装必要的Nuget包、导入命名空间、调用二维码生成API、示例代码说明等。 安装必要的Nuget包 在使用C#根据字符串生成二维码之前,需要安装一个Nuget包,名称为“QRCoder”,该包是由GitHub上的一个第三方开发人员维护,提供了生成和解析二维码的API。 导入…

    C# 2023年5月31日
    00
  • ASP.NET Core中Startup类、Configure()方法及中间件详解

    在 ASP.NET Core 中,Startup 类是应用程序的入口点,它负责配置应用程序的服务和中间件。Configure() 方法是 Startup 类中的一个方法,它用于配置应用程序的 HTTP 请求管道。本文将详细讲解 Startup 类、Configure() 方法及中间件的相关知识。 Startup 类 Startup 类是 ASP.NET Co…

    C# 2023年5月17日
    00
  • c#数据绑定之删除datatable数据示例

    c#数据绑定之删除datatable数据示例 当我们使用c#编写程序时,有时需要对DataTable进行删除某些数据的操作,并且我们也需要确保在删除数据后页面及时刷新,使删除操作得到体现。下面,我们将详细讲解如何在c#中进行数据绑定和删除操作的完整攻略。 数据绑定操作 首先,在c#中进行数据绑定操作需要实现将数据源(如DataTable)绑定到控件,这样就可…

    C# 2023年6月1日
    00
  • C#探秘系列(四)——GetHashCode,ExpandoObject

    C#探秘系列(四)——GetHashCode,ExpandoObject 什么是GetHashCode方法? GetHashCode() 方法是用于获取对象哈希码的方法,它用于实现哈希表。哈希表是一种数据结构,能够快速访问集合中的元素。哈希表的工作原理就是将任意长度的消息压缩成一固定长度的散列值,散列表是这种哈希表的一种实现。在哈希表中,每个元素由键和值组成…

    C# 2023年6月7日
    00
  • 详解C# winform ListView的基本操作

    详解C# WinForm ListView的基本操作攻略 介绍 C# WinForm中的ListView是一种非常常用的用于显示数据的控件,本攻略将详细讲解如何使用C# WinForm ListView实现基本操作,包括: ListView的基本属性设置 列表视图、图标视图、详情视图和小图标视图的展示方式 添加、删除和编辑ListView的项 ListVie…

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