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が開いているので、SwaggerUIを使用して実行したいと思います。手動でに変更http://qa-server:80/product-catalog-api/swagger/docs/v1
するhttps://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を使用してSwaggersindex.htmlのrootUrlを変更する方法まで問題を切り分けたと思います。
編集2
Swashbuckleは開発サーバーでindex.htmlを正しく生成するため、正しく構成されていると思いますが、qaは生成されないため、残りの問題は環境の違いによるものか、パッケージがqaにインストールされなかったためだと思います。正しく。
DEV:
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('{}')
};
QA:
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ロードバランサーがあります。何が起こったのかを確認するために、開発環境用の新しいA10を立ち上げましたが、開発でも同じ問題が発生しています。A10はhttpヘッダーの操作を行っていましたが、それが問題であるかどうかを確認するために削除しましたが、それでも同じことが起こりました。サーバーのセットアップ方法で、SSLがA10にオフロードされ、実際にコードを実行しているボックスがhttpを取得していると思います。そのため、Swashbuckleコードを実行すると、httpで実行されているため、問題が発生します。常にhttpsにする方法が必要だと思います。
やっと手に入れた!問題の切り分けを手伝ってくれたSampadaとstrick01に感謝します。Swashbuckleでhttpsを強制するソリューションを使用してgithubでこの記事を見つけました:
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;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加