2014-10-15 4 views
8

Ho scoperto come eseguire la mia WebAPI in base agli spazi dei nomi utilizzando this class.Utilizzo di Swagger con WebApi con versione dei nomi

Sto utilizzando Swashbuckle per aggiungere Swagger doc alla mia API, utilizzando il pacchetto Swugbuckle Nuget.

Se tengo tutto intatto, quando navigo in/swagger /, ottengo una pagina vuota.

Nel mio App_Start:

public class SwaggerConfig 
{ 
    public static void Register() 
    { 
     Bootstrapper.Init(GlobalConfiguration.Configuration); 
     SwaggerSpecConfig.Customize(c => 
      { 
       c.IncludeXmlComments(GetXmlCommentsPath()); 
      }); 
    } 

    private static string GetXmlCommentsPath() 
    { 
     return string.Format(@"{0}\App_Data\XmlDocumentation.xml", AppDomain.CurrentDomain.BaseDirectory); 
    } 
} 

E il mio web API percorsi:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{namespace}/{controller}/{id}", 
      defaults: new 
       { 
        id = RouteParameter.Optional 
       }); 
    } 
} 

Se rimuovo il {namespace} funziona (vengono visualizzati i comandi API), ma voglio mantenere questo spazio dei nomi informazioni nel mio percorso.

Come si personalizza Swagger/Swashbuckle per fare in modo che funzioni?

+1

Possibile duplicato di [Leverage MultipleApiVersions in Swagger con versioning degli attributi] (http: //stackoverflow.com/questions/30789045/leverage-multipleapiversions-in-swagger-with-attribute-versioning) – Johan

+0

@Johan: è il contrario, la mia domanda è più vecchia! : o – thomasb

+0

Sì, ma quella domanda ha una risposta migliore e la domanda con la risposta migliore è dove devono andare i collegamenti. – Johan

risposta

2

Dal repo Swashbuckle Github:

C'è un difetto nel sopra attuazione del "namespace di routing" in quanto rompe lo strato metadati WebAPI - ApiExplorer e quindi Swashbuckle.

una soluzione, anche se non risolve direttamente il problema, è quello di utilizzare l'attributo delle versioni, invece, che funziona bene con Swashbuckle:

Ie:

[RoutePrefix("api/v1/Features")] 
public class FeaturesV1Controller : ApiController 
{ 
    [Route("Products/{product}")] 
    public IList<Metadata.FeatureListItemModel> Get(long product){} 

Si prega di vedere le due questioni Github sotto per maggiori informazioni. https://github.com/domaindrivendev/Swashbuckle/issues/317 https://github.com/domaindrivendev/Swashbuckle/issues/303

Credo che con l'attributo di routing, il controller deve avere un nome diverso per ogni versione. Cioè la classe deve essere denominata FeaturesV1Controller e FeaturesV2Controller per v2, ma per i percorsi è ancora possibile utilizzare/api/v1/Features e/api/v2/Features