Использование Swagger с WebApi с версией пространства имен

Я узнал, как создать версию моего WebAPI на основе пространств имен, используя этот класс.

Я использую Swashbuckle для добавления документа Swagger в мой API с помощью пакета Swashbuckle Nuget.

Если я сохраню все в порядке, при переходе к / swagger / я получаю пустую страницу.

В моем 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);
    }
}

И мои маршруты веб-API:

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

Если я удалю {namespace} это работает (отображаются команды API), но я хочу сохранить эту информацию о пространстве имен в моем маршруте.

Как мне настроить Swagger/Swashbuckle, чтобы эта работа работала?

1 ответ

Из репозитория Swashbuckle Github:

В приведенной выше реализации "маршрутизации пространства имен" есть недостаток, поскольку он нарушает уровень метаданных WebApi - ApiExplorer и, следовательно, Swashbuckle.

Обходной путь, хотя и не решающий вашу проблему напрямую, - вместо этого использовать управление версиями атрибутов, что прекрасно работает с Swashbuckle:

То есть:

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

Пожалуйста, смотрите две проблемы Github ниже для получения дополнительной информации. https://github.com/domaindrivendev/Swashbuckle/issues/317 https://github.com/domaindrivendev/Swashbuckle/issues/303

Я считаю, что с атрибутом маршрутизации, ваш контроллер должен иметь разные имена для каждой версии. Т.е. класс должен называться FeaturesV1Controller и FeaturesV2Controller для v2, но для маршрутов вы все равно можете использовать /api/v1/Features и /api/v2/Features

Другие вопросы по тегам