gpt4 book ai didi

swagger - 如何让 Swagger UI 将端口 443 与 Swashbuckle 一起使用?

转载 作者:行者123 更新时间:2023-12-04 16:38:56 26 4
gpt4 key购买 nike

在运行 RESTful Web 服务的 QA 和 Prod 环境中,端口 80 未打开。所以目前当我尝试在 QA 中使用 Swagger UI 时,我收到此消息并且它只是挂起:
fetching resource list: http://qa-server:80/product-catalog-api/swagger/docs/v1; Please wait.
我正在使用 Swashbuckle 来配置 Swagger。我也在配置中更改了这一行,但它仍然不起作用。

// If schemes are not explicitly provided in a Swagger 2.0 document, then the scheme used to access
// the docs is taken as the default. If your API supports multiple schemes and you want to be explicit
// about them, you can use the "Schemes" option as shown below.
//
c.Schemes(new[] { "https" });

SSL 端口 443 已打开,因此我想使用 Swagger UI 在其上运行。我可以手动更改 http://qa-server:80/product-catalog-api/swagger/docs/v1https://qa-server/product-catalog-api/swagger/docs/v1然后 Swagger 将列出我的 Web 方法,但是当我单击 Try it out! 时它挂起这是控制台的输出: SCRIPT5: Access is denied. File: swagger-ui-min-js, Line: 10, Column: 4300
编辑:

所以我一直在挖掘更多,并且已经走得更远,但仍然不是我想要的地方。如果我查看 Swagger index.html 文件上的源代码,我可以看到问题:
window.swashbuckleConfig = {
rootUrl: 'http://qa-server:80/product-catalog-api',
discoveryPaths: arrayFrom('swagger/docs/v1'),
booleanValues: arrayFrom('true|false'),
validatorUrl: stringOrNullFrom('null'),
customScripts: arrayFrom(''),
docExpansion: 'none',
oAuth2Enabled: ('false' == 'true'),
oAuth2ClientId: '',
oAuth2ClientSecret: '',
oAuth2Realm: '',
oAuth2AppName: '',
oAuth2ScopeSeperator: ' ',
oAuth2AdditionalQueryStringParams: JSON.parse('{}')
};

即使我以 https 导航到该站点并将 Swashbuckle 方案设置为 https,它仍将 rootUrl 生成为 http。我想因为我使用的是 Swashbuckle,所以我必须使用它来配置 index.html,因为我的代码中没有该文件,所以我猜 Swashbuckle 正在生成它。

在更改 swagger.json 的路径时,我确实发现了我遗漏了什么。它显然需要那里的端口号。因此,如果我导航到 swagger 索引页面并手动将 json 文件的路径更改为 https://qa-server:443/product-catalog-api/swagger/docs/v1一切正常。所以现在我想我已经将问题隔离到如何使用 Swashbuckle 更改 Swaggers index.html 中的 rootUrl。

编辑 2

好吧,我想我已经正确配置了 Swashbuckle,因为它在我们的开发服务器上正确生成了 index.html,但不是 qa 所以我猜剩下的问题归结于环境的一些差异,或者我的包没有安装在 qa 中适本地。

开发:
window.swashbuckleConfig = {
rootUrl: 'https://server-dev:443/product-catalog-api',
discoveryPaths: arrayFrom('swagger/docs/v1'),
booleanValues: arrayFrom('true|false'),
validatorUrl: stringOrNullFrom('null'),
customScripts: arrayFrom(''),
docExpansion: 'none',
oAuth2Enabled: ('false' == 'true'),
oAuth2ClientId: '',
oAuth2ClientSecret: '',
oAuth2Realm: '',
oAuth2AppName: '',
oAuth2ScopeSeperator: ' ',
oAuth2AdditionalQueryStringParams: JSON.parse('{}')
};

质量保证:
window.swashbuckleConfig = {
rootUrl: 'http://qa-server:80/product-catalog-api',
discoveryPaths: arrayFrom('swagger/docs/v1'),
booleanValues: arrayFrom('true|false'),
validatorUrl: stringOrNullFrom('null'),
customScripts: arrayFrom(''),
docExpansion: 'none',
oAuth2Enabled: ('false' == 'true'),
oAuth2ClientId: '',
oAuth2ClientSecret: '',
oAuth2Realm: '',
oAuth2AppName: '',
oAuth2ScopeSeperator: ' ',
oAuth2AdditionalQueryStringParams: JSON.parse('{}')
};

编辑 3

我们进行了测试以进一步隔离问题。我们的 QA 环境中有一个 A10 负载平衡器。我们为 dev 环境立了一个新的 A10 来看看发生了什么,现在我们在 dev 中遇到了同样的问题。 A10 正在执行一些 http header 操作,我们将其删除以查看是否是问题所在,但仍然得到相同的结果。我相信随着服务器的设置方式,SSL 正在被卸载到 A10 并且实际运行我的代码的盒子正在获取 http。因此,当 Swashbuckle 代码运行时,它是在 http 下运行导致问题的。我想我需要一种方法来强制它始终为 https。

最佳答案

我终于明白了!感谢 Sampada 和 strick01 帮助我隔离问题。我在github上找到了这篇文章,其中有使用Swashbuckle强制https的解决方案:

https://github.com/domaindrivendev/Swashbuckle/issues/296

config
.EnableSwagger("docs/{apiVersion}",
c =>
{
...
c.RootUrl(ResolveBasePath);
...
})
.EnableSwaggerUi();

private static string ResolveBasePath(HttpRequestMessage message)
{
var virtualPathRoot = message.GetRequestContext().VirtualPathRoot;

var schemeAndHost = "https://" + message.RequestUri.Host;
return new Uri(new Uri(schemeAndHost, UriKind.Absolute), virtualPathRoot).AbsoluteUri;
}

关于swagger - 如何让 Swagger UI 将端口 443 与 Swashbuckle 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36625000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com