2016-04-14 12 views
5

Nei nostri ambienti QA e Prod che eseguono i nostri servizi Web RESTful, la porta 80 non è aperta. Così, al momento quando cerco di arrivare a Swagger interfaccia utente in QA, ottengo questo messaggio e si blocca solo:Come faccio a ottenere l'interfaccia utente di Swagger per utilizzare la porta 443 con Swashbuckle?

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

Sto usando Swashbuckle per configurare Swagger. Ho anche cambiato questa riga nella configurazione, ma non funziona ancora.

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

La porta SSL 443 è aperta, quindi mi piacerebbe arrivare all'interfaccia utente di Swagger per eseguirla. Posso modificare manualmente http://qa-server:80/product-catalog-api/swagger/docs/v1 a https://qa-server/product-catalog-api/swagger/docs/v1 e poi Swagger elencherò i miei metodi web, ma si blocca quando clicco Try it out! Questa è l'uscita dalla console: SCRIPT5: Access is denied. File: swagger-ui-min-js, Line: 10, Column: 4300

EDIT:

così mi è stato scavando nella un po 'di più e sono diventato un po' più lontano, ma non ancora dove voglio essere. Se ho vista origine sul file index.html Swagger, posso vedere il problema:

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

Anche se la sto navigazione verso il sito come https ed ho lo schema Swashbuckle impostato su HTTPS, è ancora generando il rootUrl come http. Penso che dal momento che sto usando Swashbuckle, devo usarlo per configurare index.html perché non ho quel file da nessuna parte nel mio codice, quindi immagino che Swashbuckle lo stia generando al volo.

Ho scoperto cosa mi mancava quando cambiavo il percorso di swagger.json. A quanto pare ha bisogno del numero di porta lì. Quindi, se si naviga alla pagina di indice swagger e si modifica manualmente il percorso del file json per essere https://qa-server:443/product-catalog-api/swagger/docs/v1, tutto funziona correttamente. Quindi ora penso di aver isolato il problema fino a come cambio rootUrl in Swaggers index.html usando Swashbuckle.

EDIT 2

Beh, penso di avere Swashbuckle configurato correttamente perché genera l'index.html correttamente sul nostro server dev, ma non QA quindi credo che il resto del problema è fino a qualche differenza in ambienti o il mio pacchetto non è stato installato correttamente in 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('{}') 
}; 

EDIT 3

Abbiamo fatto un test per isolare ulteriormente il problema. Abbiamo un bilanciatore di carico A10 nel nostro ambiente QA. Abbiamo alzato una nuova A10 per l'ambiente di sviluppo per vedere cosa è successo e ora abbiamo lo stesso problema in dev. L'A10 stava facendo una manipolazione dell'intestazione http che abbiamo rimosso per vedere se quello era il problema ma otteneva sempre la stessa cosa. Credo che con il modo in cui i server sono configurati, SSL venga scaricato nella A10 e la casella che sta effettivamente eseguendo il mio codice sta ricevendo http. Quindi, quando viene eseguito il codice Swashbuckle, è in esecuzione sotto http causando il problema. Penso di aver bisogno di un modo per costringerlo a essere sempre https.

+1

Si prega di dare un'occhiata alla mia risposta qui: http://stackoverflow.com/questions/36527586/swagger-multiple -hosts-in-same-json-spec/36542927 # 36542927. Potrebbe aiutarti. – Sampada

+0

@Sampada Questo mi aiuta a capire meglio il problema. Tuttavia, non so ancora come modificare il file index.html o json di Swagger. Sembra che Swashbuckle li stia creando dinamicamente quindi probabilmente c'è qualche configurazione di Swashbuckle che mi manca. Dopo aver letto la tua risposta, ho ricevuto alcune informazioni aggiuntive che aggiungerò alla mia domanda. Grazie! –

+0

Felice di aiutare! Non ho idea di cappa spessa però. Buona fortuna a te. – Sampada

risposta

7

Finalmente ho capito! Grazie a Sampada e strick01 per avermi aiutato a isolare il problema. Ho trovato questo articolo su github con la soluzione di https forzatura con 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

È preferibile utilizzare 'message.RequestUri.Authority' in caso di presenza di una porta personalizzata come nel caso IISExpress – Sergey

1

Swashbuckle genera la documentazione Swagger per te quando la richiesta HTTP arriva a swagger/docs/v1 o swagger/ui/index.Se la tua richiesta arriva via https allora il index.html predefinito che genera conterrà un rootUrl di https://yourdomain:443/yourapiapplication. Allo stesso modo se arriva in via http allora il rootUrl sarà http://yourdomain:80/yourapiapplication. Data questa situazione, il principale candidato per i tuoi problemi è il caching. Hai abilitato il caching della documentazione di Swagger tramite l'override del provider di swagger di default in SwaggerConfig.cs? O il tuo ambiente di QA ha server proxy o una configurazione di cache diversa da quella in dev? La rigenerazione della documentazione tramite una nuova richiesta al tuo server QA tramite HTTPS dovrebbe portare a un rootUrl corretto nel tuo index.html.

+0

Hai ragione riguardo ai server proxy. Aggiungerò qualche altro dettaglio alla mia domanda che ho appena scoperto. –

Problemi correlati