.NET 8 + Swashbuckle.AspNetCore:在子路径中运行时重写“试用”选项卡的 URL

问题描述 投票:0回答:1

为了让我们对服务进行一些简单、快速且易于访问的调试和冒烟测试,我们使用带有“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 8

Swashbuckle.AspNetCore 6.8.1

c# asp.net .net kubernetes swagger-ui
1个回答
0
投票
我假设您的 .net 应用程序前面有一个反向代理,允许您将每个子路径代理到不同的应用程序?

我可以看到两种解决此问题的方法:

    如果反向代理使用 X-Forwarded 标头。您可以将转发标头中间件与
  1. ForwardedHeaders 一起使用。 X转发前缀
  2. 最坏的情况:使用
  3. app.UsePathBase(app.Configuration["EnvVariableHavingYourSubpath"]) 调整应用程序的基本路径,这确实需要更改反向代理以告诉它也使用转发请求的子路径。
© www.soinside.com 2019 - 2024. All rights reserved.