ASP.Net 核心 3.1 Swagger 页面通过 HTTPS 加载但立即尝试使用 HTTP 并且浏览器请求失败

ASP.Net Core 3.1 Swagger Page Loads via HTTPS but Try It Now uses HTTP and Browser Fails Request

我刚刚将我的项目从 Swashbuckle 5.6.3 升级到 6.0.7。我没有做任何代码更改,但是现在当尝试使用 Swagger 页面测试 API 时,Swagger 生成的 URL 没有使用 https,即使该页面是通过 https 和所有文档加载的我发现它应该根据用于加载 Swagger 页面的 URL 推断方案。

配置代码如下:

        services.AddSwaggerGen(c => {
            c.SwaggerDoc(apiSettings.Version, new OpenApiInfo { Title = apiSettings.Name, Version = apiSettings.Version });

            c.CustomSchemaIds(type => type.FullName);

            c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme {
                Description = "JWT Authorization header using the Bearer scheme.",
                Name        = "Authorization",
                In          = ParameterLocation.Header,
                Type        = SecuritySchemeType.ApiKey,
                Scheme      = "bearer",
                Reference   = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
            });

            c.AddSecurityRequirement(new OpenApiSecurityRequirement {
                { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new List<string>() }
            });
        });

和:

        app.UseSwagger();

        app.UseSwaggerUI(c => {
            c.SwaggerEndpoint($"/swagger/{apiSettings.Version}/swagger.json", $"{apiSettings.Name} {apiSettings.Version}");
        });

现在是否有新的配置设置来指定方案?

在版本 6.0.7 中,您可以使用 MapSwagger 扩展方法更改此行为。

app.UseEndpoints(endpoints =>
{
    ...
    endpoints.MapSwagger($"/swagger/{apiSettings.Version}/swagger.json", o => 
    {
        o.PreSerializeFilters.Add((swagger, httpReq) =>
        {
           swagger.Servers.Clear();
        });
    });
});

最后,这是对我有用的最终代码。

        app.UseEndpoints(endpoints => {
            endpoints.MapControllers();

            endpoints.MapSwagger("/swagger/{documentName}/swagger.json", options => {
                options.PreSerializeFilters.Add((swagger, httpRequest) => { });
            });
        });