2016-04-14 4 views
5

In unseren QA- und Prod-Umgebungen, in denen unsere RESTful-Webdienste ausgeführt werden, ist Port 80 nicht geöffnet. Also zur Zeit, wenn ich versuche zu Swagger UI in QA zu bekommen, bekomme ich diese Meldung und es hängt nur:Wie bekomme ich Swagger UI Port 443 mit Swashbuckle zu verwenden?

fetching resource list: http://qa-server:80/product-catalog-api/swagger/docs/v1; Please wait.

ich Swashbuckle bin mit Swagger zu konfigurieren. Ich habe auch diese Zeile in der Config geändert, aber es funktioniert immer noch nicht.

// 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" }); 

Der SSL-Port 443 ist offen, so möchte ich Swagger UI bekommen darauf zu laufen. Ich kann manuell http://qa-server:80/product-catalog-api/swagger/docs/v1 zu https://qa-server/product-catalog-api/swagger/docs/v1 ändern und dann Swagger wird meine Web-Methoden Liste, aber es hängt, wenn ich Try it out! klicken Dies ist die Ausgabe von der Konsole ist: SCRIPT5: Access is denied. File: swagger-ui-min-js, Line: 10, Column: 4300

EDIT:

So habe ich gegraben in einige mehr und sind ein bisschen weiter gekommen, aber immer noch nicht dort, wo ich sein möchte. Wenn ich Quelle auf der Swagger index.html Datei anzuzeigen, kann ich das Problem sehen:

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('{}') 
}; 

Obwohl die ich als https auf die Website bin navigieren und hat https das Swashbuckle Schema festgelegt, es immer noch die Erzeugung rootUrl als http. Ich denke, da ich Swashbuckle benutze, muss ich es verwenden, um die index.html zu konfigurieren, da ich diese Datei nirgendwo in meinem Code habe, also nehme ich an, dass Swashbuckle sie im laufenden Betrieb erzeugt.

Ich habe herausgefunden, was ich bei der Änderung des Pfades der swagger.json fehlte. Es benötigt offenbar die Portnummer dort. Wenn ich also zur Swagger-Indexseite navigiere und den Pfad zur JSON-Datei manuell auf https://qa-server:443/product-catalog-api/swagger/docs/v1 ändere, funktioniert alles einwandfrei. So, jetzt denke ich habe ich das Problem isoliert, wie ändere ich die RootUrl in Swaggers index.html mit Swashbuckle.

EDIT 2

Nun, ich denke, ich habe Swashbuckle richtig konfiguriert, weil es die index.html korrekt auf unserer Entwickler-Server generiert, aber nicht qa also denke ich, der Rest des Problems ist bis zu einem gewissen Unterschied in Umgebungen oder mein Paket wurde nicht ordnungsgemäß in qa installiert.

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('{}') 
}; 

EDIT 3

Wir haben einen Test das Problem weiter zu isolieren. Wir haben einen A10 Load Balancer in unserer QA-Umgebung. Wir haben einen neuen A10 für die Entwicklungsumgebung aufgestanden, um zu sehen, was passiert ist, und wir haben jetzt das gleiche Problem in dev. Der A10 machte einige HTTP-Header-Manipulationen, die wir entfernten, um zu sehen, ob das das Problem war, aber immer noch dasselbe. Ich glaube, mit der Art, wie die Server eingerichtet werden, wird SSL auf den A10 ausgelagert und die Box, auf der mein Code läuft, bekommt http. Wenn der Swashbuckle-Code ausgeführt wird, wird er unter http ausgeführt, was das Problem verursacht. Ich denke, ich brauche einen Weg, um es zu zwingen, immer https zu sein.

+1

haben Sie einen Blick auf meine Antwort hier: http://stackoverflow.com/questions/36527586/swagger-multiple -hosts-in-gleich-json-spec/36542927 # 36542927. Könnte dir helfen. – Sampada

+0

@Sampada Das hilft mir, das Problem besser zu verstehen. Ich weiß jedoch immer noch nicht, wie ich Swaggers index.html oder json-Datei ändern kann. Es sieht so aus, als ob Swashbuckle sie dynamisch erstellt, also gibt es wahrscheinlich einige Swashbuckle-Konfigurationen, die ich vermisse. Nachdem ich deine Antwort gelesen habe, habe ich einige weitere Informationen erhalten, die ich zu meiner Frage hinzufügen werde. Vielen Dank! –

+0

Gut zu helfen! Ich habe allerdings keine Ahnung von Swashbuckle. Viel Glück. – Sampada

Antwort

7

Ich habe es endlich verstanden! Danke an Sampada und strick01, die mir geholfen haben, das Problem zu isolieren. Ich habe diesen Artikel auf Github mit der Lösung zwingt https mit Swashbuckle:

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; 
} 
+1

Es ist besser, die 'message.RequestUri.Authority' zu verwenden, wenn der benutzerdefinierte Port wie im IISExpress-Fall vorhanden ist – Sergey

1

Swashbuckle generiert die Swagger-Dokumentation für Sie, wenn die HTTP-Anforderung an swagger/docs/v1 oder swagger/ui/index kommt.Wenn Ihre Anfrage über https eingeht, enthält die von ihr generierte Standard index.html eine rootUrl von https://yourdomain:443/yourapiapplication. Ähnlich, wenn es über http kommt, wird rootUrlhttp://yourdomain:80/yourapiapplication sein. Angesichts dieser Situation ist Caching der primäre Kandidat für Ihre Probleme. Haben Sie das Zwischenspeichern der Swagger-Dokumentation über das Überschreiben des Standard-Swagger-Anbieters in SwaggerConfig.cs aktiviert? Oder hat Ihre QA-Umgebung Proxy-Server oder ein Caching-Setup, das sich von dem in Ihrem Entwicklungssystem unterscheidet? Das erneute Generieren der Dokumentation über eine neue Anfrage an Ihren QA-Server über HTTPS sollte zu einem korrekten rootUrl in Ihrer index.html führen.

+0

Sie haben Recht mit den Proxy-Servern. Ich werde meiner Frage, die ich gerade herausgefunden habe, weitere Details hinzufügen. –

Verwandte Themen