Несколько контроллеров соответствуют URL WebAPI - PullRequest
0 голосов
/ 11 октября 2018

У меня есть два метода веб-API со следующими URL-адресами маршрута.

[HTTPGET]
[Route("{Code}/{Id}")]

[HTTPGET]
[Route("{Code}/counter")]

Request /01/counter

{Id} также является строковым параметром.Следовательно, теперь я получаю ошибку при вызове второго API.«Обнаружено действие нескольких контроллеров для этого URL», поскольку webapi считает / 01 / counter действительным для обоих маршрутов.

Я видел несколько решений с использованием регулярных выражений, но пока не могу найти работающее.Что является хорошим решением для этого, чтобы оба URL-адреса работали, как ожидалось.

ОБНОВЛЕНИЕ:

Я обнаружил, что проблема происходила, так как оба метода были в разных контроллерах, следовательно, у webapi была проблемав решении, какой контроллер выбрать.После того, как я переместил их в тот же контроллер, проблема решена, так как аргументы маршрута проверяются после исправления контроллера.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

В вашем фрагменте кода нет проблем.

[HTTPGET]
[Route("{Code}/{Id}")]

[HTTPGET]
[Route("{Code}/counter")]

Похоже, что в настройках маршрутизации вашего Web API не указывается подобное.Это настройка по умолчанию, предоставляемая шаблоном.

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

В файле WebApi.config используйте этот код

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional }
        );

Надеемся, это решит вашу проблему.

0 голосов
/ 11 октября 2018

Если вы используете WebAPI 2, вы можете использовать свойство RouteOrder для определения приоритета при совпадении нескольких действий.

https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#route-order

 [HttpGet]
 [Route("{Code}/{Id}", RouteOrder = 2)]

 [HttpGet]
 [Route("{Code}/counter", RouteOrder = 1)]

Если вы используете MVC,Вы можете использовать Order свойство:

https://docs.microsoft.com/en-us/previous-versions/aspnet/mt150670(v=vs.118)

[HttpGet]
[Route("{Code}/{Id}", Order = 2)]

[HttpGet]
[Route("{Code}/counter", Order = 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...