WebAPI性能监控-MiniProfiler与Swagger集成

server/2024/11/15 4:15:01/

Net8_WebAPI性能监控-MiniProfiler与Swagger集成

要在.NET Core项目中集成MiniProfiler和Swagger,可以按照以下步骤操作:

  1. 安装NuGet包
    • 安装MiniProfiler.AspNetCore.Mvc包以集成MiniProfiler。
    • 安装MiniProfiler.EntityFrameworkCore包以监控EF Core生成的SQL语句(可选)。
    <PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.3.8" /><PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
  1. 配置服务

    • 在Startup.cs的ConfigureServices方法中添加MiniProfiler服务配置:

      services.AddMiniProfiler(options =>
      {options.RouteBasePath = "/profiler";
      })
      .AddEntityFramework();
      
    • 在Configure方法中启用MiniProfiler中间件,确保它在UseEndpoints方法之前被调用:

      app.UseMiniProfiler();
      
  2. 配置Swagger UI

    • 下载自定义的Swagger UI页面(例如从GitHub上的xuke353/swaggerui项目)并将其放置在API项目的根目录下,设置文件属性为“嵌入的资源”。

    • 修改Startup.cs中的UseSwaggerUI中间件配置,使用自定义的index.html文件:

      app.UseSwaggerUI(c =>
      {c.IndexStream = () => GetType().GetTypeInfo().Assembly.GetManifestResourceStream("YourNamespace.index.html");c.RoutePrefix = string.Empty;c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
      });
      

    • 确保替换YourNamespace为你的项目命名空间。

  3. 获取MiniProfiler HTML代码片段

    • 在一个控制器中添加一个方法来获取MiniProfiler的HTML代码片段:

      [HttpGet]
      public IActionResult GetCounts()
      {var html = MiniProfiler.Current.RenderIncludes(_accessor.HttpContext);return Ok(html.Value);
      }
      
    • 你也可以通过断点调试来获取这段HTML代码。

  4. 将HTML代码片段添加到Swagger UI

    • 将获取到的HTML代码片段粘贴到自定义的Swagger UI的index.html文件的顶部。

会出现流访问异常,就是不能再开个swagger进行访问
An unhandled exception occurred while processing the request.
ArgumentException: Stream was not readable.
System.IO.StreamReader…ctor(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen)

解决方法

                app.UseSwaggerUI(c => {c.InjectJavascript("/custom.js");}

然后再wwwroot文件夹下创建 custom.js,将生成的Javascript进行更改即可

custom.js

// 等待 DOM 完全加载
document.addEventListener('DOMContentLoaded', function () {// 创建一个新的 script 元素var newScript = document.createElement('script');// 设置 script 的属性newScript.async = true; // 设置为异步加载newScript.id = 'mini-profiler'; // 设置 IDnewScript.src = '/profiler/includes.min.js?v=4.3.8+1120572909'; // 设置脚本的源文件路径newScript.setAttribute('data-version', '4.3.8+1120572909');newScript.setAttribute('data-path', '/profiler/');newScript.setAttribute('data-current-id', '551f7bde-3d0b-4fe1-8cef-c6945f6f4d58');newScript.setAttribute('data-ids', 'a264a19a-395d-4e61-970f-6249ab868614,d26da3fb-eca3-4ada-899b-e85058c6010b,8dc76f68-5c1c-495d-95d0-5f07258aacf1,70f16caa-76de-4cd0-a957-82849d471053,41628017-8871-4b2a-af0c-5dfc2a6424cd,51df7af6-93ee-44b1-ba70-97920acbd3b9,4cee7860-8154-4897-81d7-7436c7408778,ba92e686-e4e3-4af6-8329-3c14645998b8,dbe17478-119b-49e3-bd4b-a83fe182354d,551f7bde-3d0b-4fe1-8cef-c6945f6f4d58');newScript.setAttribute('data-position', 'Left');newScript.setAttribute('data-scheme', 'Light');newScript.setAttribute('data-authorized', 'true');newScript.setAttribute('data-max-traces', '15');newScript.setAttribute('data-toggle-shortcut', 'Alt+P');newScript.setAttribute('data-trivial-milliseconds', '2.0');newScript.setAttribute('data-ignored-duplicate-execute-types', 'Open,OpenAsync,Close,CloseAsync');// 将 script 元素添加到文档的 head 中document.head.appendChild(newScript);
});
  1. 启动项目
    • 启动项目后,Swagger文档页面的左上角会出现一个小面板,当请求接口之后,会显示出当前请求的分析数据,包括接口耗时和SQL语句。

注意事项:

  • 确保IHttpContextAccessor接口在Startup.cs中进行了注册,并且通过依赖注入获取了HttpContextAccessor对象。

代码获取

关注回复241111


在这里插入图片描述


http://www.ppmy.cn/server/142018.html

相关文章

RabbitMQ的死信队列

1.死信的概念 死信简单理解就是因为种种原因&#xff0c;无法被消费的消息. 有死信自然就有死信队列&#xff0c;消息再一个队列中编程死信之后&#xff0c;它能被重新发送到另一个交换器中&#xff0c;这个交换器就是DLX&#xff0c;绑定DLX的队列&#xff0c;就被称为死信队…

技术专家之路:深耕高门槛领域的策略

技术专家之路&#xff1a;深耕高门槛领域的策略 引言 随着科技行业的飞速发展&#xff0c;技术专家成为了职场上炙手可热的角色。他们不仅享有高度的职业满意度&#xff0c;还能获得优渥的薪酬。本文旨在探讨如何通过选择并深耕高门槛领域&#xff0c;实现技术专家的职业目标…

从ROS Bag文件提取点云数据并保存为PCD格式进行处理 ros ubuntu

从ROS Bag文件提取点云数据并保存为PCD格式进行处理 要从ROS bag文件中有效地提取点云数据并利用PCL库对其进行进一步处理&#xff0c;需要通过一系列精确且专业的操作。下面是一个详细的步骤指南&#xff0c;这些步骤不仅详细介绍了如何操作&#xff0c;而且强调了确保数据处…

Mac打开time machine(时间机器)备份特殊文件

Mac 打开time machine&#xff08;时间机器&#xff09;备份特殊文件 设置“时间机器”的作用具体操作办法 前言&#xff1a;今天在使用Nas同步文件时发现有部分重要文件没有同步&#xff0c;为了省事手动拖拽复制文件&#xff0c;导致其中一份非常重要的文件丢失&#xff0c;尝…

MySQL初学之旅(2)增删改查—上

目录 1.前言 2.正文 2.1新增数据 2.1.1插入单行数据 2.1.2插入多行数据 2.2查询数据&#xff08;重要&#xff09; 2.2.1全列查询 2.2.2指定列查询 2.2.3查询字段为表达式 2.2.4别名 2.2.5去重 2.2.6排序 2.2.7条件查询 2.3修改数据 2.4删除数据 3.小结 1.前言…

Vue的基础使用

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架…

Unity网络通信(part7.分包和黏包)

目录 前言 概念 解决方案 具体代码 总结 分包黏包概念 分包 黏包 解决方案概述 前言 在探讨Unity网络通信的深入内容时&#xff0c;分包和黏包问题无疑是其中的关键环节。以下是对Unity网络通信中分包和黏包问题前言部分的详细解读。 概念 在网络通信中&#xff0c;…

【go从零单排】Regular Expressions正则表达式

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 Go 中的正则表达式是通过 regexp 包提供的&#xff0c;允许开发者使用强大的模式…