Укажите версию API для всех контроллеров WEB API - PullRequest
0 голосов
/ 20 марта 2019

Я строю API, используя Web API .NET 2, создал класс BaseController, который наследуют все остальные контроллеры.Я хотел бы применить управление версиями API с использованием атрибута [ApiVersion ()], однако я не хочу украшать каждый класс контроллера одинаковыми атрибутами, если у меня более одной версии API.Есть ли способ установить все возможные версии API для всех контроллеров?Я попытался установить атрибуты для класса BaseController, но, к сожалению, атрибуты не наследуются производными классами.

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

Вы можете использовать промежуточное ПО ApiVersioning, как показано в примере ниже.

services.AddApiVersioning(
    o =>
    {
        o.AssumeDefaultVersionWhenUnspecified = true );
        o.DefaultApiVersion = new ApiVersion( 1,0);
    } );

Устанавливает версию по умолчанию для всех контроллеров равной 1,0.Также, если версия не указана, вызов будет перенаправлен на контроллер с версией по умолчанию.

Если вы хотите создать новую версию существующего контроллера, вы можете указать атрибут версии на этом контроллере.

Надеюсь, это поможет.

0 голосов
/ 25 апреля 2019

ApiVersionAttribute преднамеренно не наследуется, потому что если вы используете наследование на ваших контроллерах, например, V2.Controllers.ValuesController наследует от V1.Controllers.ValuesController, вы получите два контроллера с одинаковым маршрутом, которые оба реализуют 1.0,что является неоднозначным и приведет к ошибке.

Есть несколько возможных способов достижения вашей цели:

  1. Создайте свой собственный атрибут, расширяющий ApiVersionsBaseAttribute , разрешите егонаследуется и применяется к базовому классу.
  2. Создайте свой собственный атрибут, внедрите IApiVersionProvider , разрешите его наследование и примените к базовому классу.
  3. Перечислите все типы контроллеров в настройке конфигурации и используйте соглашение , которое применяет одну или несколько версий API ко всем контроллерам.options.Conventions.Controller(controllerType).HasApiVersion(1.0);.Это будет объединено с явными атрибутами (например, 1.1)
  4. . Вы можете создать пользовательское соглашение , которое применяет одну или несколько версий API ко всем или отдельным контроллерам.В настоящее время соглашение может быть применено только ко всему контроллеру, но поддержка для каждого действия будет доступна в следующем основном выпуске (поскольку есть существенные изменения в API, хотя для большинства нет видимых изменений).Например, options.Conventions.Add(new MyConvention(new ApiVersion(1,0)));.

Надеюсь, это поможет.

...