2014-01-09 5 views
5

Когда я запустил этот URL-адрес: /api/users/1, он отображает только действие «Удалить», когда я использую атрибут HttpDelete. В чем причина такого поведения?Запрошенный ресурс не поддерживает метод HTTP GET

Else я получаю его сообщение: Запрошенный ресурс не поддерживает метод HTTP GET

[RoutePrefix("api/users")] 
public class UserController : ApiController 
{ 
    private readonly IUserService _userService; 
    public UserController(IUserService userService) 
    { 
     _userService = userService; 
    } 

    [Route("")] 
    public HttpResponseMessage Get() 
    { 
     return Request.CreateResponse<IEnumerable<UserDTO>>(HttpStatusCode.OK, _userService.GetUsers()); 
    } 

    [Route("{id:int}")] 
    [HttpDelete] 
    public HttpResponseMessage Delete(int id) 
    { 
     _userService.Delete(id); 
     return Request.CreateResponse(HttpStatusCode.OK, "User was deleted successfully"); 
    } 
} 

Это мои маршруты:

config.MapHttpAttributeRoutes(); 

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

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

ответ

16

По соглашению, HTTP глаголы будут совпадать с именем действия, которые с префиксом этого HTTP-глагола.

Итак, он жалуется, что у вас нет действия для HTTP GET, который является глаголом, используемым при прохождении простого запроса с вашим браузером. Вам нужно что-то действие с именем, как:

public HttpResponseMessage Get(int id) 

или даже

public HttpResponseMessage GetUser(int id) 

Очевидно, что если вы сделаете запрос с DELETE, он будет карту в действие Удалять вы определили.

Ref: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

«Для того, чтобы найти действие, Web API смотрит на методе HTTP, а затем ищет действия, имя которого начинается с этим именем метода HTTP, например, с помощью запроса GET, Web API. ищет действие, которое начинается с «Get ...», например «GetContact» или «GetAllContacts». Это соглашение применяется только к методам GET, POST, PUT и DELETE. Вы можете включить другие методы HTTP, используя атрибуты на вашем контроллер. Мы увидим пример этого позже ».

+0

Вы видите комментарий «удален для краткости», был мой публичный HttpResponseMessage Get(), поэтому это не может быть причиной, о которой вы говорите. Я обновил свой вопрос с полным кодом (метод Get) – Elisabeth

+0

Но вам не хватает действия GET, которое принимает параметр. На основе вашего URL/api/users/1 вы хотите передать 1 в качестве аргумента, но у вас нет действия GET, которое его принимает. Маршрутизация ищет действие, подобное 'public HttpResponseMessage Get (int id)' –

+0

Когда я использую скрипач с api/users/1 и устанавливаю http-глагол DELETE, он работает. Но когда я запускаю api/users/1 в URL-адресе браузера, он хочет вызвать Get (int id) (как вы сказали). Означает ли это, что каждый запуск URL в браузере - это запрос GET по умолчанию? – Elisabeth