Можно ли использовать AddApiVersioning () без указания каждого контроллера? - PullRequest
0 голосов
/ 22 марта 2020

Я управляю версией моего Asp. Net API Api 2 Web, используя config.AddApiVersioning() в моем WebApiConfig. Каждый из моих контроллеров украшен чем-то вроде [Route("api/TestApi/v{version:apiVersion}/{action}/{id?}")].

. Я хотел бы удалить большинство этих украшений и вместо этого использовать что-то подобное в моем WebApiConfig:

config.Routes.MapHttpRoute(
    "ApiControllerVersionActionId",
    "api/{controller}/v{version:apiVersion}/{action}/{id}",
    new { id = UrlParameter.Optional },
    new
    {
        // e.g., 1.0, 12.75
        apiVersion = @"^[0-9]+\.[0-9]+$",

        // only GUIDs or integers
        id = @"^(\{){0,1}(\(){0,1}[0-9a-fA-F]{8}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{12}(\)){0,1}(\}){0,1}$|^\d+$"
    }
);

Мои вопросы:

  • Возможно ли это?
  • Есть примеры? Большинство примеров, которые я нашел, украшают все контроллеры.

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Я решил эту проблему и теперь могу удалить все RouteAttribute с моих контроллеров.

Проблема была с ограничениями. Я изменил свой MapHttpRoute следующим образом:

config.Routes.MapHttpRoute(
    "ApiControllerVersionActionId",
    "api/{controller}/v{apiVersion}/{action}/{id}",
    new { id = UrlParameter.Optional },
    new
    {
        apiVersion = new ApiVersionRouteConstraint(),

        // empty string, guid, or int
        id = @"^$|^(\{){0,1}(\(){0,1}[0-9a-fA-F]{8}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{12}(\)){0,1}(\}){0,1}$|^\d+$"
    }
);
0 голосов
/ 25 марта 2020

Я подумал, что мог бы также упомянуть, что вы можете создавать версии, используя Соглашения о версии API независимо от метода маршрутизации ( на основе соглашения или на основе атрибута ). Существует встроенная поддержка обязательных контроллеров версий, а также соглашение о версии, содержащее пространство имен. Вы также можете свернуть свое собственное соглашение, чтобы определить, какие версии API применяются к контроллерам.

Вы добавляете свое соглашение к конфигурации следующим образом:

options.Conventions.Add( new MyVersioningConvention() );

Если вы хотите использовать Прямая маршрутизация (он же атрибут маршрутизации ), но не хочу повторять сегмент версии снова и снова, есть и другие альтернативы. Вы можете использовать любой из следующих подходов в ASP. NET Web API:

  1. Расширить RoutePrefixAttribute и автоматически включать префикс (например: ApiRoutePrefixAttribute )
  2. Создайте пользовательский IRoutePrefix , который, вероятно, будет применяться через атрибут, но не обязательно должен быть
  3. Расширить и заменить DefaultDirectRouteProvider
  4. Реализация пользовательского IDirectRouteProvider

Я надеюсь, что это обеспечит некоторые другие полезные решения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...