.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
相关产品推荐
相关产品推荐

