.NET 6.0中Swashbuckle.AspNetCore生成空白Swagger页面求助
修复Swagger UI空白页面的可行方案
方案1:替换自定义Swagger UI索引页
直接使用官方标准的Swagger UI索引页,规避Swashbuckle自动生成脚本的语法问题:
- 在项目中创建
wwwroot/swagger目录(若不存在),新增index.html文件。 - 复制官方Swagger UI基础HTML结构,手动配置
swagger.json路径与UI参数,核心是将原JSON.parse转义字符串改为原生JS对象,避免换行解析错误:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Swagger UI</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui.css" /> <style> html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; } *, *:before, *:after { box-sizing: inherit; } body { margin: 0; background: #fafafa; } </style> </head> <body> <div id="swagger-ui"></div> <script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui-bundle.js"></script> <script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui-standalone-preset.js"></script> <script> const configObject = { urls: [{ url: "/MyWebAPI/swagger/v1/swagger.json", name: "MyApp v1" }], deepLinking: false, persistAuthorization: false, displayOperationId: false, defaultModelsExpandDepth: 1, defaultModelExpandDepth: 1, defaultModelRendering: "example", displayRequestDuration: false, docExpansion: "list", showExtensions: false, showCommonExtensions: false, supportedSubmitMethods: ["get","put","post","delete","options","head","patch","trace"], tryItOutEnabled: false }; const oauthConfigObject = { scopeSeparator: " ", scopes: [], useBasicAuthenticationWithAccessCodeGrant: false, usePkceWithAuthorizationCodeGrant: false }; // 保留原兼容代码 configObject.urls.forEach(function (item) { if (item.url.startsWith("http") || item.url.startsWith("/")) return; item.url = window.location.href.replace("index.html", item.url).split('#')[0]; }); window.onload = function() { const ui = SwaggerUIBundle({ ...configObject, dom_id: '#swagger-ui', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset ], layout: "StandaloneLayout" }); window.ui = ui; }; </script> </body> </html>
- 确保静态文件中间件优先于Swagger中间件加载,保证索引页能正常访问。
方案2:调整Swashbuckle配置,强制生成正确脚本
在Program.cs/Startup.cs中配置Swagger UI时,指定JSON序列化规则,避免生成多行转义字符串:
app.UseSwaggerUI(options => { options.SwaggerEndpoint("/MyWebAPI/swagger/v1/swagger.json", "MyApp v1"); options.RoutePrefix = "swagger"; // 手动配置UI参数,禁用自动格式化 options.ConfigObject = new SwaggerUIConfigObject { Urls = new List<UrlDescriptor> { new UrlDescriptor { Url = "/MyWebAPI/swagger/v1/swagger.json", Name = "MyApp v1" } }, DeepLinking = false, PersistAuthorization = false, DisplayOperationId = false, DefaultModelsExpandDepth = 1, DefaultModelExpandDepth = 1, DefaultModelRendering = ModelRendering.Example, DisplayRequestDuration = false, DocExpansion = DocExpansion.List, ShowExtensions = false, ShowCommonExtensions = false, SupportedSubmitMethods = new[] { SubmitMethod.Get, SubmitMethod.Put, SubmitMethod.Post, SubmitMethod.Delete, SubmitMethod.Options, SubmitMethod.Head, SubmitMethod.Patch, SubmitMethod.Trace }, TryItOutEnabled = false }; // 配置序列化规则,生成紧凑无换行的JSON options.ConfigObjectSerializerSettings = new JsonSerializerSettings { Formatting = Formatting.None, StringEscapeHandling = StringEscapeHandling.EscapeHtml }; });
该配置会让Swashbuckle生成单一行的JSON字符串,避免浏览器解析时因多行拆分导致的语法错误。
方案3:检查静态文件中间件顺序
确保UseStaticFiles()在UseSwagger()和UseSwaggerUI()之前调用,否则Swagger UI依赖的CSS、JS静态资源无法加载,导致页面空白:
app.UseStaticFiles(); // 必须前置 app.UseSwagger(); app.UseSwaggerUI(...);
内容的提问来源于stack exchange,提问作者Piotrek B.
相关产品推荐
相关产品推荐

