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 设置解决混合内容错误的主要内容,如果未能解决你的问题,请参考以下文章
加载 API 定义失败,获取错误:未定义 /swagger/v1/swagger.json
Swagger UI 未在 index.html 页面上显示任何内容