You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Swagger页面头部内容的动态修改或添加动态内容?

实现Swagger UI头部内容动态更新的方案

默认通过options.HeadContent设置的内容是静态的,因为它只在应用启动时初始化一次。要实现动态内容(比如显示当前时间、计数器),可以用以下两种方案:

方案一:嵌入JavaScript动态修改前端内容

直接在HeadContent中注入脚本,页面加载后通过JS定时更新内容,适合前端能生成的动态数据(如客户端时间、本地计数器)。

代码示例:

applicationBuilder.UseSwaggerUI(options =>
{
    options.HeadContent = @"
        <script>
            // 动态更新当前时间
            function updateCurrentTime() {
                const now = new Date().toLocaleString();
                const timeEl = document.getElementById('dynamic-time');
                timeEl && (timeEl.textContent = `当前时间:${now}`);
            }

            // 动态更新访问计数器
            function updateCounter() {
                const counterEl = document.getElementById('dynamic-counter');
                counterEl && (counterEl.textContent = `访问计数器:${++window.counterCount}`);
            }

            window.onload = function() {
                const topBar = document.querySelector('.swagger-ui .topbar');
                if (!topBar) return;

                // 添加时间显示元素
                const timeDiv = document.createElement('div');
                timeDiv.id = 'dynamic-time';
                timeDiv.style.margin = '0 16px';
                timeDiv.style.color = '#fff';
                topBar.appendChild(timeDiv);

                // 添加计数器元素
                const counterDiv = document.createElement('div');
                counterDiv.id = 'dynamic-counter';
                counterDiv.style.margin = '0 16px';
                counterDiv.style.color = '#fff';
                topBar.appendChild(counterDiv);

                window.counterCount = 0;
                updateCurrentTime();
                updateCounter();

                // 每秒更新时间,每5秒更新计数器
                setInterval(updateCurrentTime, 1000);
                setInterval(updateCounter, 5000);
            };
        </script>
    ";
});

方案二:自定义中间件拦截请求替换后端动态数据

如果需要展示后端生成的动态内容(如服务器时间、业务统计数据),可以通过中间件拦截Swagger UI页面请求,替换页面中的占位符。

步骤1:设置占位符

applicationBuilder.UseSwaggerUI(options =>
{
    options.HeadContent = "<div id='backend-dynamic-content' style='margin:0 16px; color:#fff;'>{{BACKEND_DATA}}</div>";
});

步骤2:添加自定义中间件(需放在UseSwaggerUI之前)

app.Use(async (context, next) =>
{
    if (context.Request.Path.StartsWithSegments("/swagger"))
    {
        // 替换响应流以修改内容
        var originalBody = context.Response.Body;
        using var tempBody = new MemoryStream();
        context.Response.Body = tempBody;

        await next();

        // 读取并修改响应内容
        tempBody.Seek(0, SeekOrigin.Begin);
        var responseHtml = await new StreamReader(tempBody).ReadToEndAsync();

        // 生成后端动态数据
        var backendData = $"服务器当前时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";
        responseHtml = responseHtml.Replace("{{BACKEND_DATA}}", backendData);

        // 将修改后的内容写回响应
        var modifiedBytes = Encoding.UTF8.GetBytes(responseHtml);
        context.Response.ContentLength = modifiedBytes.Length;
        await originalBody.WriteAsync(modifiedBytes, 0, modifiedBytes.Length);
        context.Response.Body = originalBody;
    }
    else
    {
        await next();
    }
});

方案选择

  • 前端本地动态内容:优先用方案一,实现简单无需后端介入;
  • 依赖后端数据的动态内容:用方案二,能获取后端实时生成的数据。

内容的提问来源于stack exchange,提问作者Mo B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:17:40