欢迎光临
个人技术文档整理

.Net Core WebAPI性能监控-MiniProfiler与Swagger集成

什么是 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文档页面的左上角就出现了一个小的面板,会显示出当前请求的分析数据。(如果项目启动后,左上角小面板没出来,点请求接口后就会出来了)

image

注意事项

  • MiniProfiler的脚本代码 ,直接拷贝可能不正确,因为拷贝来的的版本号和我们所引用Nuget的版本号并不一致,所以需要自己生成一下

参考

https://github.com/swagger-api/swagger-ui/blob/master/dist/index.html

 

赞(1)