2015-05-01 8 views
11

all. Sto cercando di documentare un WebApi 2 usando il pacchetto Swashbuckle.Come posso creare un percorso url in Swashbuckle/Swaggerwork quando api viene servita da un altro progetto?

Tutto funziona alla grande se l'API è in esecuzione da solo vale a dire localhost/api/spavalderia mi porta a UI e localhost/api/spavalderia/docs/v1 a JSON.

Tuttavia, l'app di produzione inizializza questo stesso progetto Webapi eseguendo il metodo webapiconfig di questo progetto da global.asax.cs in un altro - ora progetto web (quello principale dell'applicazione). Quindi l'URL api è simile a localhost/web/api invece di localhost/api.

Ora lo swashbuckle non funziona affatto.

  • localhost/api/swagger genera errore non può caricare 'API.WebApiApplication', ben naturalmente
  • localhost/web/spavalderia = 404
  • localhost/web/api/spavalderia = 404

Ho provato a cercare ovunque, ma tutto ciò che ho trovato è una soluzione.

c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + VirtualPathUtility.ToAbsolute("~/").TrimEnd('/')); 

Purtroppo non funziona, ora forse dovrebbe e ho solo bisogno di cambiare qualcosa, ma io non so nemmeno cosa esattamente questa proprietà si aspetta e quello che dovrebbe essere impostato.

Potrebbe non essere nemmeno applicabile - forse l'installazione richiede qualcos'altro o alcune modifiche al codice dello swashbuckle.

Apprezzerò qualsiasi aiuto tu possa fornire. Sto davvero cominciando ad apprezzare lo spavaldo (e lo swashbuckle) per la documentazione di riposo.

risposta

14

Per Swashbuckle 5.x:

questo sembra essere fissato dalla an extension method of httpConfiguration called EnableSwagger. Swashbuckle 5.x migration readme nota che questo sostituisce SwaggerSpecConfig. SwaggerDocConfig RootUrl() sostituisce specificamente ResolveBasePathUsing() da 4.x.

funziona questo praticamente lo stesso come ha fatto prima, si presenta come il più grande cambiamento è stato che è stato rinominato e si porta in SwaggerDocConfig:

public void RootUrl(Func<HttpRequestMessage, string> rootUrlResolver) 

Un esempio dal readme, ottimizzato per brevità:

string myCustomBasePath = @"http://mycustombasepath.com"; 

httpConfiguration 
    .EnableSwagger(c => 
     { 
      c.RootUrl(req => myCustomBasePath); 

      // The rest of your additional metadata goes here 
     }); 

Per Swashbuckle 4.x:

0.123.516,410617 millions

Utilizzare SwaggerSpecConfig ResolveBasePathUsando e fare in modo che lambda legga il proprio endpoint conosciuto.

ResolveBasePathUsing:

public SwaggerSpecConfig ResolveBasePathUsing(Func<HttpRequestMessage, string> basePathResolver); 

mio API è dietro un bilanciatore di carico e questo è stato una soluzione utile a fornire un indirizzo di base. Ecco un esempio stupido per utilizzare ResolveBasePathUsing per risolvere il percorso con un percorso di base noto.

Ho hardcoded l'endpoint per chiarezza, ma è possibile definirlo ovunque. Puoi anche use the request object to attempt to cleanup your request uri puntare a/web/api anziché/api.

Lo sviluppatore commented on this workaround su GitHub scorso anno:

Il lambda prende la corrente HttpRequest (vale a dire la richiesta di un dato Swagger ApiDeclaration) e dovrebbe restituire una stringa da utilizzare come baseurl per il vostro Api . Per le app con bilanciamento del carico, questo dovrebbe restituire il percorso di bilanciamento del carico.

L'implementazione di default è la seguente:

(req) => req.RequestUri.GetLeftPart(UriPartial.Authority) + req.GetConfiguration().VirtualPathRoot.TrimEnd('/'); 

...

Re percorsi relativi, le specifiche Swagger richiede percorsi assoluti perché l'URL in cui viene servita la Swagger non deve essere il URL di l'effettiva API.

...

La lambda è passata un'istanza HttpRequestMessage ... si dovrebbe essere in grado di utilizzare questo per arrivare alla RequestUri ecc Un'altra opzione, si può solo inserire il nome host nel web.config e chiedi a Lambda di leggerlo da lì.

+0

Questo articolo github è stato il primo che ho letto, l'ultimo commento è esattamente dove ho ottenuto il codice che ho inserito nella mia domanda. Non ha funzionato. Mi piacerebbe provarlo nel modo in cui descrivi, perché almeno ora vedo ciò che è previsto come valore. Ma il codice che hai fornito non funziona così com'è. VS si lamenta di SwaggerSpecConfig come indefinito. Puoi fornire il codice completo e una versione di swashbuckle con cui funziona questo codice? Per favore. – Dmitriy

+0

@ user1803063 Vedere il mio aggiornamento. Sto usando Swashbuckle.Core 4 con alcune estensioni non correlate. Guardando Swashbuckle 5, sembra che questa funzione per l'url di base sia stata ripulita un po 'e resa più facile da trovare e utilizzare. Non preoccuparti di SwaggerSpecConfig e 'ResolveBasePathUsing' se stai usando 5, è stato sostituito con il metodo di estensione httpConfiguration' EnableSwagger'. Mi dispiace per la confusione, non ho ancora bisogno di aggiornare a 5 e questo sembrava un problema molto simile che ho avuto prima. :) –

+0

Sfortunatamente non funziona. Sto iniziando a pensare che potrebbe essere un bug. Ho provato a mettere tutto in RootUrl http: // localhost, http: // localhost/web e http: // localhost/web/api genera ancora 404 per me. – Dmitriy

Problemi correlati