Маршрутизация атрибутов Web API 2 для управления версиями API - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть приложение ASP.NET Web API 2, которое использует маршрутизацию на основе соглашений:

[app-url]/v1/[controller]

Теперь я хочу добавить еще одну версию в API и обнаружил, что маршрутизация атрибутов является самым простым способом.добиться того, чего я хочу.Поэтому я зарегистрировал маршруты Web API в методе Application_Start(), как показано ниже.

GlobalConfiguration.Configure(WebApiConfig.Register);

Кроме того, я убедился, что метод Register() в классе WebApiConfig содержит только следующую строку:

config.MapHttpAttributeRoutes();

Существует два контроллера для проверки версий:

/ v1 / StatusController.cs

[RoutePrefix("v1/status")]
public class StatusController : ApiController
{
    [Route("")]
    public string Get()
    {
        return "V1 - OK";
    }
}

/ v2 / StatusController.cs

[RoutePrefix("v2/status")]
public class StatusController : ApiController
{
    [Route("")]
    public string Get()
    {
        return "V2 - OK";
    }
}

Однако при переходе к одному из указанных ниже маршрутов я получаю сообщение об ошибке.

  1. [app-url] / v1 / status
  2. [app-url] / v2 / status

ОШИБКА СЕРВЕРА

404 - Файл или каталог не найдены.

Возможно, искомый ресурс был удален, изменилось его имя или временно недоступен.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вместо использования разных пространств имен используйте разные имена контроллеров (если это работает для вас).Если это так, то вот как должен выглядеть код:

/ v1 / StatusController.cs:

[System.Web.Http.RoutePrefix("v1/status")]
public class StatusController : ApiController
{
    [System.Web.Http.Route("")]
    public string Get()
    {
        return "V1 - OK";
    }
 }

/ v2 / StatusController.cs:

[System.Web.Http.RoutePrefix("v2/status")]
public class Status2Controller : ApiController
{
    [System.Web.Http.Route("")]
    public string Get()
    {
        return "V2 - OK";
    }
 }

Теперь вы сможете вызывать эти 2 разные версии, вызывая Http Get Method, например:

Https://YourUrl.com/v1/status

и:

Https://YourUrl.com/v2/status

Надеюсь, эта предложенная альтернатива поможет.Удачи.

0 голосов
/ 13 февраля 2019

Ваш подход не будет работать, потому что ASP.NET Web API использует так называемый Controller Selector, чтобы найти соответствующий контроллер для данного маршрута.Однако этот селектор не учитывает пространство имен контроллера, а использует его имя.

По умолчанию Web API поставляется с DefaultHttpControllerSelector , и вы можете найти информацию о его реализации. здесь .

Возможное решение вашей проблемы - реализовать пользовательский IHttpControllerSelector и указать Web API использовать его вместо этого.Для этого вы можете найти несколько примеров в Интернете.

Вместо этого вы также можете изменить имена контроллеров на уникальные, например:

  • StatusV1Controller
  • StatusV2Controller
...