2014-01-09 6 views
5

이 URL을 실행할 때 : /api/users/1 HttpDelete-Attribute를 사용할 때만 삭제 동작으로 매핑됩니다. 이 행동의 이유는 무엇입니까? 그렇지요청한 리소스가 HTTP 메소드를 지원하지 않습니다. GET

나는 그의 메시지가 : 요청 된 자원은 HTTP 방법이 내 루트입니다

[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"); 
    } 
} 

GET 지원하지 않습니다, HTTP 동사는 액션 이름과 일치합니다 관례

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 GET에 대한 작업이 없다는 불만이 있습니다.

public HttpResponseMessage Get(int id) 

또는 DELETE와 요청을 분명히 경우에도

public HttpResponseMessage GetUser(int id) 

, 그것은 사용자가 정의한 삭제 작업에 매핑됩니다 : 당신은 같은 행동이라는 것이 필요합니다.

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

"웹 API는 HTTP 방식에서 찾은 다음 이름이 그 HTTP 메소드 이름으로 시작 동작을 찾습니다 예를 들어, GET 요청, 웹 API와 함께, 작업을 찾으려면 "GetContact"또는 "GetAllContacts"와 같이 "Get ..."으로 시작하는 동작을 찾습니다.이 규약은 GET, POST, PUT 및 DELETE 메서드에만 적용됩니다. 우리는 나중에 그 예를 보게 될 것이다. "

+0

내 공개 HttpResponseMessage Get()이 있었기 때문에 "간략히하기 위해 삭제됨"주석이 표시되므로 이것이 사용자가 말하는 이유가 될 수 없습니다. 내 질문을 전체 코드로 업데이트했습니다 (메소드 가져 오기) – Elisabeth

+0

그러나 매개 변수를 허용하는 GET 조치가 누락되었습니다. URL/api/users/1을 기준으로 1을 인수로 전달하려고하지만 GET 액션을 허용하지 않습니다. 라우팅은'public HttpResponseMessage Get (int id)'와 같은 액션을 찾고 있습니다. –

+0

api/users/1에서 바이올린을 사용하고 http 동사를 DELETE로 설정하면 작동합니다. 하지만 브라우저 url에서 api/users/1을 트리거하면 Get (int id)을 트리거하려고합니다 (말한대로). 브라우저에서 실행되는 모든 URL은 기본적으로 GET 요청입니까? – Elisabeth

관련 문제