评论

Net8_WebAPI性能监控-MiniProfiler与Swagger集成

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

  1. 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. 1. 配置服务

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

services.AddMiniProfiler(options =>

{

options.RouteBasePath = "/profiler";

})

.AddEntityFramework;

  • • 在Configure方法中启用MiniProfiler中间件,确保它在UseEndpoints方法之前被调用:

app.UseMiniProfiler;
  1. 1. 配置Swagger UI

    • • 修改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为你的项目命名空间。

  1. 1. 获取MiniProfiler HTML代码片段

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

[ HttpGet]

publicIActionResult GetCounts

{

varhtml = MiniProfiler.Current.RenderIncludes(_accessor.HttpContext);

returnOk(html.Value);

}

  • • 你也可以通过断点调试来获取这段HTML代码。

public IEnumerable<WeatherForecast> GetAll2

{

using (MiniProfiler.Current.Step("获取成功后,开始处理最终数据"))

{

// 一些逻辑...

using (MiniProfiler.Current.Step("准备数据"))

{

using (MiniProfiler.Current.CustomTiming("SQL", "SELECT * FROM Config"))

{

// 模拟一个SQL查询

Thread.Sleep(500);

}

}

}

var datas = Enumerable.Range(1, 5).Select(index => new WeatherForecast

{

Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),

TemperatureC = Random.Shared.Next(-20, 55),

Summary = Summaries[Random.Shared.Next(Summaries.Length)]

});

return datas;

}

  1. 1. 将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.InjectJava("/custom.js");

}

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

custom.js

// 等待 DOM 完全加载

document.addEventListener('DOMContentLoaded', function {

// 创建一个新的 元素

var new = document.('');

// 设置 的属性

new.async = true; // 设置为异步加载

new.id = 'mini-profiler'; // 设置 ID

new.setAttribute('data-path', '/profiler/');

new.setAttribute('data-current-id', '551f7bde-3d0b-4fe1-8cef-c6945f6f4d58');

new.setAttribute('data-position', 'Left');

new.setAttribute('data-scheme', 'Light');

new.setAttribute('data-authorized', 'true');

new.setAttribute('data-max-traces', '15');

new.setAttribute('data-toggle-shortcut', 'Alt+P');

new.setAttribute('data-trivial-milliseconds', '2.0');

new.setAttribute('data-ignored-duplicate-execute-types', 'Open,OpenAsync,Close,CloseAsync');

// 将 元素添加到文档的 head 中

document.head.(new);

});

  1. 1. 启动项目

    • • 启动项目后,Swagger文档页面的左上角会出现一个小面板,当请求接口之后,会显示出当前请求的分析数据,包括接口耗时和SQL语句。

注意事项:

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

    返回搜狐,查看更多

责任编辑:

平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()