2015-01-21 3 views
5

Позвольте мне обрисовать ситуацию первый:Почему HttpGet требуется только для некоторых действий?

У меня есть базовый контроллер, который выглядит следующим образом:

public class SearchRequestController : ApiController 
{ 
    public IEnumerable<ObjectA> GetAllRequests() {...} 
    {} 
    public IEnumerable<ObjectA> GetLatestRequest() {...} 
    {} 
} 

Использование следующих маршрутизации

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

Я могу Исли использовать следующие функции

Http://myServer/myvirtualdirectory/api/SearchRequest/GetAllRequests 
Http://myServer/myvirtualdirectory/api/SearchRequest/GetLatestRequest 

Теперь я хотел добавить е следующий контроллер

public class UserController : ApiController 
{ 
    public IEnumerable<UserObject> SearchUsersByInput() {...} 
} 

Но следующий GET не работает

Http://myServer/myvirtualdirectory/api/User/SearchUsersByInput 

I'm getting a 405: {"Message":"The requested resource does not support http method 'GET'."} 

Это работает, однако, когда я изменить свою функцию следующим образом:

public class UserController : ApiController 
{ 
    [HttpGet] 
    public IEnumerable<UserObject> SearchUsersByInput() {...} 
} 

Вопрос: Может кто-то объяснить происхождение этого поведения? Я сделал что-то неправильно или что-то не так с моей маршрутизацией?

+0

Это просто не получилось, потому что вы не указали атрибут и не соблюдали соглашения об именах. –

+0

@JeroenVannevel Thnx для ответа. Атрибут, который вы указываете, является '[HttpGet]' правильным? – User999999

ответ

6

Пожалуйста, обратитесь к сообщению here

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

+0

Действительно замечательно. Изменение имени функции из 'Search'UsersByInput() в' Get'UsersByInput() действительно разрешило его для меня. – User999999

+0

Ugh. Магические соглашения об именах в WebAPI делают мою голову. – spender

1

Это поведение по умолчанию для веб-служб по умолчанию в asp.net - они не поддерживают метод GET, не указав явно, что они должны.

Так просто используйте [HttpGetAttribute] для методов должен поддерживать GET через HTTP:

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

+0

Thnx для информации. Некоторые дальнейшие чтения о '[HttpGetAttribute]' дали мне предложение моей много желательной информации о маршрутизации. – User999999