2016-11-28 1 views
0

У меня есть контроллер с различными действиями и один из них является:несколько действий было обнаружено, что соответствует запросу в WebAPI

[HttpGet] 
public IList<string> GetFoo(string id = null) 
{ ... } 

Это действие имеет индивидуальный маршрут:

routes.MapHttpRoute(
    name: "GetFoos", 
    routeTemplate: "api/my/foo/{_id}", 
    defaults: new { controller = "My", action = "GetFoo" } 
); 

Когда я добавляю еще одну акцию :

[HttpGet] 
public IList<string> GetBar() 
{ ... } 

Запрос на локальный/API/мой/Foo/терпит неудачу:

Multiple actions were found that match the request: 
↵System.Collections.Generic.IList`1[System.String] GetFoo(System.String) on type Controllers.MyController 
↵System.Collections.Generic.IList`1[System.String] GetBar() on type Controllers.MyController" 

Может кто-нибудь объяснить, пожалуйста, почему это происходит? Я указал action = "GetFoo" для api/my/foo, почему он соответствует GetBar?

ответ

2

Возможно, вы настроили маршрут следующим образом и запросите без ID - /api/my/foo.

config.Routes.MapHttpRoute(
    name: "GetFoos", 
    routeTemplate: "api/my/foo/{id}", 
    defaults: new {controller = "My", action = "GetFoo"} 
); 

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

Если да, то первый маршрут не соответствует и падение бросает маршрут по умолчанию, но маршрут по умолчанию совпадает с несколькими действиями.

Примечание: GetFoos маршрут будет работать, если вы запрашиваете с ID явно - /api/my/foo/1


В идеале, если вы видите себя, используя слишком много пользовательских маршрутов, вы можете рассмотреть возможность использования маршрута Атрибут, доступный в Web API 2, вместо создания индивидуального маршрута в конфигурации маршрута.

Например,

[RoutePrefix("Api/My")] 
public class MyController : ApiController 
{ 
    [HttpGet] 
    [Route("foo/{id:int}")] 
    public IList<string> GetFoo(int id) 
    { 
     return new string[] {"Foo1-" + id, "Foo1-" + id}; 
    } 

    [HttpGet] 
    [Route("bar/{id:int}")] 
    public IList<string> GetBar(int id) 
    { 
     return new string[] {"Bar1-" + id, "Bar1-" + id}; 
    } 
} 

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

  • Нет связанных вопросов^_^