asp.net-core - 在反向代理后面运行时,使用端口 80 进行 https 的 Swashbuckle

标签 asp.net-core swagger asp.net-core-webapi swagger-ui swashbuckle

我有一个用 swagger/swashbuckle 记录的 .net core api。
在 localhost 上的 url https://localhost:44390/上运行 swagger ui 时,“尝试一下”工作正常。
我们在 Azure 的应用服务中使用相同的解决方案,其中 Azure Front Door 作为反向代理。 Front Door 只接受 https 流量并且只转发 https 流量。前门域为 widget.example.com,应用服务为 widget-test-app.azurewebsites.net。使用 url https://widget.example.com/api/index.html 在 Azure 中运行 swagger ui 时与在 localhost 中运行相比,有两个不同之处:

  • swagger ui 显示 Servers 标题和下拉菜单
  • swagger ui 将服务器 url 显示为 https://widget.example.com:80

  • 我使用以下代码在 api 中添加了一个端点
    return $"Host {HttpContext.Request.Host.Host} Port {HttpContext.Request.Host.Port} Https {HttpContext.Request.IsHttps}";
    
    请求时 https://widget.example.com/api/v1/test/url它返回

    Host widget-test-app.azurewebsites.net Port Https True


    这完全没问题,因为前门正在更改主机头。但是,端口是空的。
    摘要 :Swagger ui 在服务器下拉列表中显示正确的域,但端口号错误。如果它是 80 或 443,我怎样才能让它省略端口号,或者正确添加它?
    更新:问题出在反向代理后面的 swagger.json 文件中,该文件包含一个 servers 元素
    "servers": [{
      "url": "https://widget.example.com:80"
    }]
    
    启动.配置服务
    services.AddApiVersioning(options => {
      options.Conventions.Add(new VersionByNamespaceConvention());
    });
    
    services.AddVersionedApiExplorer(o => {
      o.GroupNameFormat = "'v'VVV";
      o.SubstituteApiVersionInUrl = true;
    });
    
    services.AddSwaggerGen(c => {
      c.SwaggerDoc("v1", new OpenApiInfo {
        Title = "Widget backend v1", Version = "v1"
      });
      c.SwaggerDoc("v2", new OpenApiInfo {
        Title = "Widget backend v2", Version = "v2"
      });
      c.EnableAnnotations();
      c.AddEnumsWithValuesFixFilters();
    
      var xmlFile = $ "{Assembly.GetExecutingAssembly().GetName().Name}.xml";
      var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
      c.IncludeXmlComments(xmlPath);
    });
    
    启动.配置
    app.UseSwagger(options => {
      options.RouteTemplate = "/api/swagger/{documentname}/swagger.json";
    });
    
    app.UseSwaggerUI(options => {
      foreach(var description in provider.ApiVersionDescriptions) {
        options.SwaggerEndpoint($ "/api/swagger/{description.GroupName}/swagger.json", "widget backend " + description.GroupName);
      }
      options.RoutePrefix = "api";
    });
    

    最佳答案

    为了解决这个问题,我清除了服务器列表。这是我的代码:

    app.UseSwagger(options =>
    {
        options.RouteTemplate = "/api/swagger/{documentname}/swagger.json";
        options.PreSerializeFilters.Add((swagger, httpReq) =>
        {
            //Clear servers -element in swagger.json because it got the wrong port when hosted behind reverse proxy
            swagger.Servers.Clear();
        });
    });
    

    关于asp.net-core - 在反向代理后面运行时,使用端口 80 进行 https 的 Swashbuckle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64417930/

    相关文章:

    entity-framework - EF Core OnDelete 限制添加附加列

    json - Swagger 在 Docker Image 中使用本地 json 文件运行

    spring - Swagger 未使用 Spring Boot 检测 Spring Data Rest API

    c# - 如何将多部分/表单数据发送到 ASP.NET Core Web API?

    c# - Web API 无法使用 GET 绑定(bind)不可变对象(immutable对象),但可以使用 POST

    asp.net-core - 如何在 .Net Core Web API 中完全消除 COR 错误?

    asp.net-core - 删除天气预报默认路线

    amazon-web-services - 使用yum在Amazon Linux 2中安装.NET Core

    .net - 是什么导致我的 Entity Framework Core dbContext 泄漏内存?

    java - 使用 maven 配置 swagger-ui