为了让我们对服务进行一些简单、快速且易于访问的调试和冒烟测试,我们使用带有“Try it out”功能的 Swagger Web UI。
这对于本地发展非常有效,并能提供快速反馈。
这些服务部署在 Kubernetes 中,我们创建和部署的每个服务都可以通过应用程序主域上自己的子路径进行访问,例如:
https://app.example.org/book-import/swagger/...
https://app.example.org/order-export/swagger/...
...
Swagger UI 可通过 https://app.example.org/book-import/swagger/index.html
访问,但 UI 中生成的 URL 仍假定“无子路径”,并且“尝试一下”请求的 URL 如下所示:
https://app.example.org/api/...
而不是
https://app.example.org/book-import/api/...
我尝试使用 PreSerializeFilters
但它的表现不符合预期。这是我目前拥有的:
app.MapSwaggerDefaults(builder.Configuration, swaggerOptions: options =>
{
options.PreSerializeFilters.Add((swagger, httpReq) =>
{
app.Services.GetRequiredService<ILogger<Program>>().LogInformation("Swagger path: {Path}", httpReq.Path.Value);
if (httpReq.Path.Value != null && !httpReq.Path.Value.StartsWith("/swagger"))
{
swagger.Servers = new List<OpenApiServer> { new OpenApiServer { Url = httpReq.Path.Value.Replace("/swagger", "!").Split('!')[0] } };
}
});
});
我正在尝试将 /swagger
部分替换为整个请求 URL(如果它不是以
/swagger
开头)。在 Visual Studio 本地运行此版本的应用程序“有效”,因为我可以在
if (httpReq.Path.Value != ...
中设置一个断点,它会在那里中断。但是如果我通过 Visual Studio Kubernetes Bridge 在完全部署的集群上运行相同的代码或构建并推送包含此更改的新映像并将其部署到完全部署的集群,则它不起作用。 Swagger UI 中的 URL 没有更改,我什至没有看到日志输出
Swagger path:
如何设置 Swagger UI 的“试用”功能的 URL,以便它在应用程序在子路径中运行时起作用?
或者这些 PreSerializeFilters
在 K8s 上的工作方式有所不同吗?我也尝试过,但没有成功:
builder.Services.AddSwaggerGen(o =>
o.SwaggerGeneratorOptions.Servers = new List<OpenApiServer> { new OpenApiServer { Url = "/book-import" }
});
.NET 8Swashbuckle.AspNetCore 6.8.1
我可以看到两种解决此问题的方法: