0

У меня есть следующие настройки маршрутов по умолчанию для моего веб-API служб ...«Множественные действия были найдены» ошибка

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

config.Routes.MapHttpRoute(
    name: "DefaultPost", 
    routeTemplate: "api/{controller}", 
    defaults: new { action = "Post" }, 
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) } 
    ); 

config.Routes.MapHttpRoute(
    name: "DefaultGetWithId", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { action = "Get" }, 
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
    ); 

config.Routes.MapHttpRoute(
    name: "DefaultPutWithId", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { action = "Put" }, 
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) } 
    ); 

config.Routes.MapHttpRoute(
    name: "DefaultDeleteWithId", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { action = "Delete" }, 
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) } 
    ); 

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

У меня есть следующие услуги в рамках «UsersController»:

public UserDto Get(string id){} 

[HttpGet] 
public UserDto ByEmail(string email) 

[HttpGet] 
public bool IsEmailUnique(string email) 

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

Если я должен был выполнить «/api/users/[email protected]», не должен знать, что «ByEmail» - это действие и с помощью метода & действие соответствует правильному методу? Наверное, я что-то упускаю.

ответ

0

Кажется, вы сопоставили методы BeEmail и IsEmailUnique с действием GET, что вызвало множество действий.

Поскольку вы уже настроили шаблон маршрутизации для именованных действий (DefaultControllerWithAction), вы можете удалить атрибут [HttpGet].

После этого routetemplate «DefaultControllerWithAction» должен разобраться «/ API/пользователей/byemail» просто отлично

редактирования: Кажется есть проблема смешивания традиционных и глагола на основе маршрутизации в такой же ApiController. Вот документально here on codeplex и есть один блог, который утверждает, что решил эту проблему (пока не проверено): http://blog.appliedis.com/2013/03/25/web-api-mixing-traditional-verb-based-routing/

edit2:
просто проверял это и решение от Кип Streithorst работает для вашей ситуации.

Step 1:hardcode a default value instead of specifying that action is optional. 
Step 2:decorate your "verb-based controllers with the hardcoded default action name

Для ваших запросов получить это будет:

 
    config.Routes.MapHttpRoute(
     name: "DefaultControllerWithAction", 
     routeTemplate: "api/{controller}/{action}", 
     defaults: new { action = "DefaultAction } 
     ); 
    config.Routes.MapHttpRoute(
     name: "DefaultGetWithId", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { action = "Get" }, 
     constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
     ); 
    config.Routes.MapHttpRoute(
     name: "DefaultControllerWithIdAndAction", 
     routeTemplate: "api/{controller}/{id}/{action}", 
     defaults: new { action = "DefaultAction" } 
     ); 

и

 
    [ActionName("DefaultAction")] 
    public UserDto Get(string id){} 

    [HttpGet] 
    public UserDto ByEmail(string email) 

    [HttpGet] 
    public bool IsEmailUnique(string email) 
+1

Я думал, что «HttpGet» необходимо, чтобы позволить апи знать, что сервис ожидает запрос Получить только. В противном случае это POST по умолчанию. – Skadoosh

+0

Doh ... да, мой плохой, извините за эту ошибку. Кажется, что существует проблема смешения традиционной и глагольной маршрутизации в том же ApiController. Это описано здесь: http://aspnetwebstack.codeplex.com/workitem/184, и есть одно сообщение в блоге, которое утверждает, что оно решило это: http://blog.appliedis.com/2013/03/25/web- api-mix-традиционный-глагол-на основе маршрутизации/Надеюсь, что это помогает больше, чем мой deadwrong ответ .. – AardVark71

Смежные вопросы