什么是 MiniProfiler 和 Swagger
-
MiniProfiler:MiniProfiler 是一个轻量级的性能分析工具,可以帮助开发人员监控代码的执行时间、数据库查询、内存使用等性能指标。通过将 MiniProfiler 集成到项目中,可以迅速识别性能瓶颈,从而优化应用程序的性能。
-
Swagger:Swagger 是一个用于生成、展示和测试 API 文档的工具。它可以自动生成 API 文档,提供交互式的 API 测试界面,并为开发人员和团队提供清晰的 API 文档,有助于加速开发过程。
安装 NuGet 包
Install-Package MiniProfiler.AspNetCore
Install-Package Swashbuckle.AspNetCore
在startup.cs 配置MiniProfiler
- 在startup.cs 中配置服务ConfigureServices
services.AddHttpContextAccessor();//注册 HTTP 请求上下文的服务 //注册 MiniProfiler 服务 services.AddMiniProfiler(options => { options.RouteBasePath = "/profiler"; });
- 激活中间件,启用MiniProfiler服务,放在UseEndpoints方法之前。
app.UseMiniProfiler();
获取显示MiniProfiler的脚本代码
/// <summary>
/// 获取显示MiniProfiler的脚本代码
/// </summary>
[HttpGet]
public IActionResult GetProfilerHtml()
{
var html = MiniProfiler.Current.RenderIncludes(HttpContext);
return Ok(html.Value);
}
<!-- profiler 显示 -->
<script async="async" id="mini-profiler"
src="/profiler/includes.min.js?v=4.3.8+1120572909"
data-version="4.3.8+1120572909"
data-path="/profiler/"
data-current-id=""
data-ids=""
data-position="Left"
data-scheme="Light"
data-authorized="true"
data-max-traces="15"
data-toggle-shortcut="Alt+P"
data-trivial-milliseconds="2.0"
data-ignored-duplicate-execute-types="Open,OpenAsync,Close,CloseAsync"></script>
配置Swagger自定义页面
- 新建页面 swagger-index.html(参考:https://github.com/swagger-api/swagger-ui/blob/master/dist/index.html)
- 把 显示MiniProfiler的脚本代码 插入到页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>%(DocumentTitle)</title>
<link rel="stylesheet" type="text/css" href="./swagger-ui.css" />
<link rel="stylesheet" type="text/css" href="index.css" />
<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
%(HeadContent)
</head>
<body>
<div id="swagger-ui"></div>
<script src="./swagger-ui-bundle.js" charset="UTF-8"></script>
<script src="./swagger-ui-standalone-preset.js" charset="UTF-8"></script>
<!-- MiniProfiler的脚本代码 -->
<script async="async" id="mini-profiler"
src="/profiler/includes.min.js?v=4.3.8+1120572909"
data-version="4.3.8+1120572909"
data-path="/profiler/"
data-current-id=""
data-ids=""
data-position="Left"
data-scheme="Light"
data-authorized="true"
data-max-traces="15"
data-toggle-shortcut="Alt+P"
data-trivial-milliseconds="2.0"
data-ignored-duplicate-execute-types="Open,OpenAsync,Close,CloseAsync"></script>
<script>
window.onload = function () {
var configObject = JSON.parse('%(ConfigObject)');
configObject.dom_id = "#swagger-ui";
configObject.presets = [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset];
configObject.layout = "StandaloneLayout";
if (!configObject.hasOwnProperty("oauth2RedirectUrl"))
configObject.oauth2RedirectUrl = window.location.href.replace("index.html", "oauth2-redirect.html");
//配置
const ui = SwaggerUIBundle(configObject);
//权限
var oauthConfigObject = JSON.parse('%(OAuthConfigObject)');
ui.initOAuth(oauthConfigObject);
};
</script>
</body>
</html>
配置Swagger
- 在startup.cs 中注册服务
services.AddSwaggerGen();
- 修改UseSwaggerUI中间件的配置
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseSwagger(); app.UseSwaggerUI(c => { CustomizeSwaggerIndex(c); //自定义 Swagger 首页 c.SwaggerEndpoint("/swagger/v1/swagger.json", "我的 API V1"); }); app.UseMiniProfiler(); }
/// <summary> /// 自定义 Swagger 首页 /// </summary> /// <param name="swaggerUIOptions"></param> private static void CustomizeSwaggerIndex(SwaggerUIOptions swaggerUIOptions) { var thisType = typeof(Startup); var thisAssembly = thisType.Assembly; var thisAssemblyName = thisAssembly.GetName().Name; var customIndex = $"{thisAssemblyName}.Extensions.SwaggerUI.swagger-index.html"; swaggerUIOptions.IndexStream = () => { StringBuilder htmlBuilder; // 读取文件内容 using (var stream = thisAssembly.GetManifestResourceStream(customIndex)) { using var reader = new StreamReader(stream); htmlBuilder = new StringBuilder(reader.ReadToEnd()); } // 返回新的内存流 var byteArray = Encoding.UTF8.GetBytes(htmlBuilder.ToString()); return new MemoryStream(byteArray); }; }
效果
当请求接口之后,Swagger文档页面的左上角就出现了一个小的面板,会显示出当前请求的分析数据。(如果项目启动后,左上角小面板没出来,点请求接口后就会出来了)
注意事项
- MiniProfiler的脚本代码 ,直接拷贝可能不正确,因为拷贝来的的版本号和我们所引用Nuget的版本号并不一致,所以需要自己生成一下
参考
https://github.com/swagger-api/swagger-ui/blob/master/dist/index.html