asp.net core swagger RoutePrefix

cygmwpex  于 12个月前  发布在  .NET
关注(0)|答案(3)|浏览(125)

我有一个API站点使用Swagger来公开API。dotnet核心版本是2.1,Swagger是Swashbuckle。AspNetCore 3.0.0。我API站点位于反向代理(nginx)后面,nginx URL是https://www.aa.com/chat,Map到后端服务器http://127.0.0.1:5003/,我的Swagger配置是:ConfigureServices:

services.AddSwaggerGen(c =>
                {
                    c.SwaggerDoc("v1", new Info { Title = "aa.IM.CustomerApi", Version = "v1" });
                    var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
                    var controllerXmlPath = Path.Combine(basePath, "aa.IM.CustomerApi.xml");
                    var entityXmlPath = Path.Combine(basePath, "aa.IM.Entity.xml");
                    c.IncludeXmlComments(controllerXmlPath);
                    c.IncludeXmlComments(entityXmlPath);
                    //c.DescribeAllEnumsAsStrings();
                });

字符串
配置:

app.UseSwagger(c =>
            {
            });
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("v1/swagger.json", "aa.IM.CustomerApi");
            });


然后,我可以输入到ui https://www.aa.com/chat/swagger/index.html,然后ui可以显示所有完美的,但是,当我执行一个API(URI是cus/settings),我发现请求URL https://www.aa.com/cus/settings是错误的,正确的URL是https://www.aa.com/chat/cus/settings.
我如何修复我的swagger配置来解决这个问题?我已经尝试了很多方法,像http://eatcodelive.com/2017/05/19/change-default-swagger-route-in-an-asp-net-core-web-api/How to change base url of Swagger in ASP.NET core,但这些都不能解决我的问题。

9wbgstp7

9wbgstp71#

谢谢大家,我通过下面的配置解决了这个问题:

app.UseSwagger(c =>
            {
                c.PreSerializeFilters.Add((doc, requset) =>
                {
                    var root = "https://www.aa.com/chat/";
                    doc.Host = root;
                });
            });

字符串

qyzbxkaa

qyzbxkaa2#

你可以尝试使用app.js Rewriter重写你的URL。

app.UseRewriter(new RewriteOptions()
    .AddRewrite(@"/cus/settings", "Chat$1", skipRemainingRules: true));

字符串
请注意,这是未经测试的,只是写出来的我的头。

mum43rcc

mum43rcc3#

如果您使用的是OpenAPI v3,则doc.Host将不存在。替换为doc.Servers,如果您的代理设置了所有X-头并且它们是单值的,则可以像这样初始化(请注意,如果您的网络中有多个代理,则X-*头是多值的)。

app.UseSwagger(options =>
{
  options.PreSerializeFilters.Add((doc, request) =>
  {
    string? host = request.Headers["x-forwarded-host"];
    string? port = request.Headers["x-forwarded-port"];
    string? proto = request.Headers["x-forwarded-proto"];
    string? prefix = request.Headers["x-forwarded-prefix"];

    if (host != null && port != null && proto != null && prefix != null)
    {
      doc.Servers = new List<OpenApiServer> { new() { Url = $"{proto}://{host}:{port}{prefix}" } };
    }
  });
});

字符串
如果您想填充OpenApiServer模型类,则可以在这些类上使用更多属性。

相关问题