2014-10-15 9 views
8

Wyjaśniłem, jak przeprowadzić aktualizację mojego interfejsu WebAPI w oparciu o przestrzenie nazw przy użyciu this class.Używanie programu Swagger z wersją WebApi

Używam Swashbuckle, aby dodać dokument Swagger do mojego API, używając pakietu Swashbuckle Nuget.

Jeśli zachowam wszystko w nienaruszonym stanie, po przejściu do opcji/swagger/otrzymam pustą stronę.

W moim 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); 
    } 
} 

A moja Web API trasy:

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

Jeśli usunąć {namespace} to działa (wyświetlane są polecenia API), ale chcę zachować ten nazw informacje na mojej trasie.

Jak dostosować Swagger/Swashbuckle, aby to działało?

+1

Możliwy duplikat [Leverage MultipleApiVersions w Swagger z wersją atrybutów] (http: //stackoverflow.com/questions/30789045/leverage-multipleapiversions-in-swagger-with-attribute-versioning) – Johan

+0

@Johan: Jest na odwrót, moje pytanie jest starsze! : o – thomasb

+0

Tak, ale to pytanie ma lepszą odpowiedź, a pytanie z lepszą odpowiedzią brzmi: gdzie linki powinny się znaleźć. – Johan

Odpowiedz

2

Z repo Swashbuckle GitHub:

Jest to wada w powyższym realizacji „namespace” routingu gdyż przełamuje warstwy metadanych WebAPI - ApiExplorer i stąd Swashbuckle.

Rozwiązaniem, chociaż bezpośrednio nie rozwiąże problemu, jest użycie atrybutu o wersjach zamiast, który współpracuje z Swashbuckle:

IE:

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

proszę zobaczyć dwie kwestie GitHub poniżej, aby uzyskać więcej informacji. https://github.com/domaindrivendev/Swashbuckle/issues/317 https://github.com/domaindrivendev/Swashbuckle/issues/303

wierzę, że z trasy atrybutu, kontroler musi mieć inną nazwę dla każdej wersji. To znaczy. klasa powinna być nazwana FeatureV1Controller i FeatureV2Controller dla v2, ale dla tras nadal możesz używać/api/v1/Features i/api/v2/Features

Powiązane problemy