Swagger 设置解决混合内容错误

Posted

技术标签:

【中文标题】Swagger 设置解决混合内容错误【英文标题】:Swagger settings to solve mixed content error 【发布时间】:2021-02-12 19:42:08 【问题描述】:

我有一个由 swagger 记录的 dotnet core web api。 我是这样设置的:

    public void ConfigureServices(IServiceCollection services)
    
        services.AddControllers();
        services.AddHealthChecks();
        services.AddSingleton(sp =>
        
            var options = new JsonSerializerOptions();
            options.Converters.Add(new DateTimeOffsetConverter());
            options.Converters.Add(new LabelDataConverter());
            return options;
        );
        services.AddCacheManager(Configuration);
        services.AddKafkaConsumers(Configuration);

        services.AddSwaggerGen(c =>
        
            c.SwaggerDoc("v1", new OpenApiInfo  Title = "X.WebApi", Version = "v1" );
        );
        
        services.AddInfluxDb(options => Configuration.GetSection("InfluxDb").Bind(options));
    

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        

        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "X.WebApi v1"));

        app.UseRouting();

        app.UseAuthorization();

        app.UseHealthChecks("/health");

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

我可以在本地机器上通过 swagger ui 运行端点,但是当我将应用程序部署到服务器时,我收到了 TypeError: Failed to fetch 错误。这是我在浏览器控制台上看到的:

swagger-ui-bundle.js:2 混合内容:“https://xyconsul.z.com/swagger/index.html”处的页面是通过 HTTPS 加载的,但请求了不安全的资源“http:/” /xyconsul.z.com/v1/Path/1'。此请求已被阻止;内容必须通过 HTTPS 提供。

我应该如何更新 swagger 设置才能在服务器上正常运行?

【问题讨论】:

确保您在Conifgure 中的代码遵循以下示例:docs.microsoft.com/en-us/aspnet/core/tutorials/… 顺序很重要...您必须在UseRouting... 之前放置招摇的东西 @Andy 是的,招摇的东西就在 UseRouting() 调用之前。 我已经使用了 swagger/swashbuckle 数百次,从未见过这个错误。它必须与您的Configure 方法的设置方式有关。您可能应该显示该方法中的所有代码。 @Andy 更新了配置方法 如果您在生产环境中的代理后面运行,则很有可能位于 dotnet 核心前面的防火墙/反向代理配置为卸载 ssl 流量。因此,您最终可以向 Internet 提供 https,但您的 aspnetcore Web 应用程序认为使用 http 提供服务。克服这个问题的唯一方法是通过app.UseForwardedHeaders();app.UseHttpMethodOverride(); 【参考方案1】:

部署后,您的应用程序是否使用代理服务器、负载平衡器等以 HTTPS 公开?

如果是,那么您的问题可能不是 Swagger 本身,而是在转换为 HTTP 时丢失了原始 HTTPS 方案。事实上,请检查您是否能够调用您的 API。

在这种情况下,解决方案可能与文档中的 here 相同。 (请检查一下,因为中间件等的顺序有一些调整。)

简而言之,你可以试试这样的:

public void ConfigureServices(IServiceCollection services)

    // Configure this as suited for your case
    services.Configure<ForwardedHeadersOptions>(options =>
    
        // Processing all forward headers (the default is None)
        options.ForwardedHeaders = ForwardedHeaders.All;

        // Clearing known networks and proxies collections
        options.KnownNetworks.Clear(); 
        options.KnownProxies.Clear();
    );
    // ...


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    

    // If you only specify this and don't perform the configuration
    // in "ConfigureServices", the default configuration is used
    app.UseForwardedHeaders();
    // ...

【讨论】:

以上是关于Swagger 设置解决混合内容错误的主要内容,如果未能解决你的问题,请参考以下文章

Swagger 2.0不支持:带路径的多个操作

scw——03错误,swagger开启错误

加载 API 定义失败,获取错误:未定义 /swagger/v1/swagger.json

Swagger UI 未在 index.html 页面上显示任何内容

SpringBoot集成Swagger2实现Restful(类型转换错误解决办法)

Swagger2解决swagger文档地址请求404的问题