如何让Swagger UI使用端口443和Swashback?

如何让Swagger UI使用端口443和Swashback?,swagger,swashbuckle,Swagger,Swashbuckle,在运行RESTful web服务的QA和Prod环境中,端口80未打开。因此,目前,当我尝试在QA中访问Swagger UI时,我收到了以下消息,它只是挂起: 获取资源列表:http://qa-server:80/product-目录api/swagger/docs/v1;请稍候。 我正在使用Swashback配置Swagger。我也在配置中更改了这一行,但它仍然不起作用 // If schemes are not explicitly provided in a Swagger 2.0 doc

在运行RESTful web服务的QA和Prod环境中,端口80未打开。因此,目前,当我尝试在QA中访问Swagger UI时,我收到了以下消息,它只是挂起:

获取资源列表:http://qa-server:80/product-目录api/swagger/docs/v1;请稍候。

我正在使用Swashback配置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是开放的,所以我想使用Swigger UI在其上运行。我可以手动更改
http://qa-server:80/product-目录api/swagger/docs/v1
https://qa-server/product-catalog-api/swagger/docs/v1
然后,Swagger将列出我的web方法,但当我单击
尝试时,它会挂起这是控制台的输出:
SCRIPT5:访问被拒绝。文件:swagger ui min js,第10行,第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的形式导航到该站点,并将Swashback方案设置为https,它仍然以http的形式生成rootUrl。我想因为我使用的是Swashback,所以我必须使用它来配置index.html,因为我的代码中没有该文件,所以我猜Swashback正在动态生成它

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

编辑2

嗯,我想我已经正确地配置了Swashback,因为它在我们的开发服务器上正确地生成index.html,而不是qa,所以我想问题的其余部分是由于环境的不同,或者我的包没有正确地安装在qa中

开发人员:

质量保证:

编辑3


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

当HTTP请求进入
Swagger/docs/v1
Swagger/ui/index
时,Swashback会为您生成Swagger文档。如果您的请求是通过
https
传入的,那么它生成的默认index.html将包含
rootUrl
https://yourdomain:443/yourapiapplication
。类似地,如果它通过
http
传入,则
rootUrl
将是
http://yourdomain:80/yourapiapplication
。在这种情况下,问题的主要候选对象是缓存。您是否已通过覆盖SwaggerConfig.cs中的默认Swagger提供程序启用了对Swagger文档的缓存?或者您的QA环境是否有不同于开发环境的代理服务器或缓存设置?通过HTTPS向QA服务器发出新请求来重新生成文档,应该会在index.html中生成正确的
rootUrl

我终于找到了!感谢Sampada和strick01帮助我解决问题。我在github上找到了这篇文章,它提供了使用Swashback强制https的解决方案:


请看一下我的答案:。“可能会帮助你。”桑帕达说,这有助于我更好地理解这个问题。但是,我仍然不知道如何更改Swagger的index.html或json文件。看起来Swashback是动态创建的,所以可能有一些Swashback配置我没有。在阅读了你的答案之后,我确实得到了一些更多的信息,我将添加到我的问题中。谢谢很乐意帮忙!不过我不知道什么是虚张声势。祝你好运。关于代理服务器,你是对的。我将为我刚刚发现的问题添加更多细节。如果存在自定义端口,最好使用
message.RequestUri.Authority
,如IISExpress案例
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('{}')
};
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;
}