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

.NET 8隔离进程下Azure Functions的SwaggerUI配置问题

.NET 8 隔离工作进程下保留SwaggerUI功能的方案

1. 适配HttpRequestData的Swagger元数据生成

原方案依赖HttpRequest获取Host信息,切换到HttpRequestData后,直接从其Uri属性提取协议、主机名(含端口),用来生成正确的Swagger JSON访问地址,替代原Host逻辑。

2. 重构SwaggerUI相关函数

针对三个不同路由的函数,统一调整逻辑,确保每个路由都能正确返回SwaggerUI页面或对应版本的Swagger JSON。

示例代码实现

先安装必要NuGet包

确保项目引入以下包:

Swashbuckle.AspNetCore.Swagger
Swashbuckle.AspNetCore.SwaggerUI

① 生成Swagger JSON的函数(路由示例:swagger/{documentName}/swagger.json)

[Function("GetSwaggerJson")]
public static HttpResponseData Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "swagger/{documentName}/swagger.json")] HttpRequestData req,
    string documentName,
    ILogger log)
{
    var response = req.CreateResponse(HttpStatusCode.OK);
    
    // 初始化Swagger生成器,指定当前函数程序集
    var swaggerGenerator = new SwaggerGenerator(
        new SwaggerGeneratorOptions(),
        new ApiDescriptionGroupCollectionProvider(
            new EmptyApiDescriptionProvider(),
            new[] { typeof(YourFunctionClass).Assembly }));
    
    // 生成对应文档版本的Swagger元数据,自动从Uri取协议和主机
    var swaggerDoc = swaggerGenerator.GenerateSwagger(documentName, null, req.Uri.Scheme, req.Uri.Host);
    
    response.Headers.Add("Content-Type", "application/json");
    response.WriteAsJsonAsync(swaggerDoc).Wait();
    
    return response;
}

② 返回SwaggerUI页面的函数(路由示例:swagger/ui)

[Function("SwaggerUi")]
public static HttpResponseData Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "swagger/ui")] HttpRequestData req,
    ILogger log)
{
    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/html");
    
    // 构建SwaggerUI页面,动态注入当前环境的Swagger JSON地址
    var swaggerUiHtml = $@"
<!DOCTYPE html>
<html>
<head>
    <title>Swagger UI</title>
    <link rel=""stylesheet"" href=""https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui.css"" />
</head>
<body>
    <div id=""swagger-ui""></div>
    <script src=""https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-bundle.js""></script>
    <script>
        window.onload = function() {{
            const url = '{req.Uri.Scheme}://{req.Uri.Host}/swagger/v1/swagger.json';
            SwaggerUIBundle({{
                url: url,
                dom_id: '#swagger-ui',
                presets: [
                    SwaggerUIBundle.presets.apis,
                    SwaggerUIBundle.SwaggerUIStandalonePreset
                ]
            }});
        }};
    </script>
</body>
</html>";
    
    response.WriteString(swaggerUiHtml);
    return response;
}

③ 自定义版本的SwaggerUI函数(路由示例:swagger/ui/v2)

如果需要对应不同API版本的UI,复制上述UI函数并修改路由和Swagger JSON地址即可:

[Function("SwaggerUiV2")]
public static HttpResponseData RunV2(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "swagger/ui/v2")] HttpRequestData req,
    ILogger log)
{
    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/html");
    
    var swaggerUiHtml = $@"
<!DOCTYPE html>
<html>
<head>
    <title>Swagger UI V2</title>
    <link rel=""stylesheet"" href=""https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui.css"" />
</head>
<body>
    <div id=""swagger-ui""></div>
    <script src=""https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-bundle.js""></script>
    <script>
        window.onload = function() {{
            const url = '{req.Uri.Scheme}://{req.Uri.Host}/swagger/v2/swagger.json';
            SwaggerUIBundle({{
                url: url,
                dom_id: '#swagger-ui',
                presets: [
                    SwaggerUIBundle.presets.apis,
                    SwaggerUIBundle.SwaggerUIStandalonePreset
                ]
            }});
        }};
    </script>
</body>
</html>";
    
    response.WriteString(swaggerUiHtml);
    return response;
}

3. 关键注意事项

  • 替换代码中的YourFunctionClass为你项目中任意函数类的类型,确保Swagger生成器能扫描到所有函数API
  • 本地调试时,req.Uri.Host会自动包含端口(如localhost:7071),无需额外配置
  • 部署到Azure后,req.Uri会自动获取函数应用的域名,保证Swagger JSON地址正确
  • 若需权限控制,可将AuthorizationLevel改为Function或Admin,并配置对应访问策略

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:42:49