2014-07-16 12 views
5

Ho scritto un asp web-API e ho aggiunto il controllo delle versioni all'api utilizzando this class.documentazione web-api & swagger

mie rotte simile a questa:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "{namespace}/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(config)); 

modo che io possa accedere https://localhost:44301/v1/test

Ora sto provando ad aggiungere Swagger a produrre alcuni documentazione API (in realtà sto usando il pacchetto Swashbuckle Nuget)

Quando si naviga a /swagger la pagina viene caricata, ma esce con errori per tutti i controller:

Unable to read api 'TestController' from path https://localhost:44301/swagger/api-docs/TestController (server returned undefined) 

Se passo in rassegna a https://localhost:44301/swagger/api-docs/TestController si tratta con un NullReferenceException con una traccia pila di:

at Swashbuckle.Swagger.OperationGenerator.CreateParameter(ApiParameterDescription apiParamDesc, String apiPath) 
    at Swashbuckle.Swagger.OperationGenerator.<>c__DisplayClass2.<ApiDescriptionToOperation>b__1(ApiParameterDescription paramDesc) 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Swashbuckle.Swagger.OperationGenerator.ApiDescriptionToOperation(ApiDescription apiDescription) 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
    at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Swashbuckle.Swagger.ApiExplorerAdapter.CreateApi(IGrouping`2 apiDescriptionGroup, OperationGenerator operationGenerator) 
    at Swashbuckle.Swagger.ApiExplorerAdapter.<>c__DisplayClassb.<GetDeclaration>b__7(IGrouping`2 apiDescGrp) 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
    at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Swashbuckle.Swagger.ApiExplorerAdapter.GetDeclaration(String basePath, String version, String resourceName) 
    at Swashbuckle.Application.CachingSwaggerProvider.<>c__DisplayClass4.<GetDeclaration>b__3(String k) 
    at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) 
    at Swashbuckle.Application.CachingSwaggerProvider.GetDeclaration(String basePath, String version, String resourceName) 
    at Swashbuckle.Application.SwaggerSpecHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    at System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    at System.Web.Http.HttpServer.<>n__FabricatedMethod9(HttpRequestMessage , CancellationToken) 
    at System.Web.Http.HttpServer.<SendAsync>d__0.MoveNext() 

Se cambio il percorso migliore per raggiungere:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
) 

Le pagine Swagger poi lavorare, ma l'api attuale no!

Quindi la domanda è: come posso far funzionare Swagger con una API versione?

+0

Hi! Sono esattamente nella stessa situazione. Sei mai stato in grado di risolvere il tuo problema? – thomasb

risposta

1

Alla fine ho usato SDammann.WebApi.Versioning pacchetto NuGet e le seguenti tratte:

VersionedControllerSelector.VersionPrefix = "v"; 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "v{version}/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

miei controllori sono in uno spazio dei nomi chiamati v1 o v2 ecc

+1

Dove riesci a far funzionare tutto questo con Swagger? – CamHart

+0

Sì, ho usato il metodo sopra per far funzionare il controllo delle versioni – Paul

-1

provare questo

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}" 
      //defaults: new { id = RouteParameter.Optional } 
     );