[asp.net] ASP.NET Web Api : 요청 된 리소스가 http 메서드 ‘GET’을 지원하지 않습니다.

ApiController에 다음 작업이 있습니다.

public string Something()
{
    return "value";
}

그리고 다음과 같이 내 경로를 구성했습니다.

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

베타에서는 제대로 작동했지만 최신 릴리스 후보로 업데이트했으며 이제 다음과 같은 호출에 오류가 표시됩니다.

요청 된 리소스는 http 메소드 ‘GET’을 지원하지 않습니다.

왜 더 이상 작동하지 않습니까?

(내가 {action}을 제거하고 수많은 컨트롤러를 만들 수 있다고 생각하지만, 지저분하다.)



답변

컨트롤러의 작업에 대해 HttpMethod를 구성하지 않은 경우 RC의 HttpPost 만있는 것으로 간주됩니다. 베타에서는 GET, PUT, POST 및 Delete와 같은 모든 방법을 지원한다고 가정합니다. 이것은 베타에서 RC 로의 작은 변경 사항입니다. [AcceptVerbs ( “GET”, “POST”)]를 사용하여 작업에 대해 하나 이상의 httpmethod를 쉽게 장식 할 수 있습니다.


답변

위의 모든 정보는 정확합니다. 또한 [AcceptVerbs()]주석이 System.Web.Mvc 및 System.Web.Http 네임 스페이스에 모두 존재 한다는 점을 지적하고 싶습니다 .

Web API 컨트롤러 인 경우 System.Web.Http를 사용하려고합니다.


답변

이것이 OP에 대한 답은 아니지만 완전히 다른 근본 원인에서 똑같은 오류가 발생했습니다. 다른 사람에게 도움이된다면 …

나에게 문제는 WebAPI가 예기치 않게 요청을 라우팅하게 만드는 잘못된 이름의 메서드 매개 변수였습니다. 내 ProgrammesController에 다음 메서드가 있습니다.

[HttpGet]
public Programme GetProgrammeById(int id)
{
    ...
}

[HttpDelete]
public bool DeleteProgramme(int programmeId)
{
    ...
}

… / api / programmes / 3에 대한 DELETE 요청은 내가 예상 한대로 DeleteProgramme로 라우팅되지 않고 GetProgrammeById로 라우팅되었습니다. DeleteProgramme에 id라는 매개 변수 이름이 없기 때문입니다. GetProgrammeById는 물론 GET 만 허용하는 것으로 표시되어 DELETE를 거부했습니다.

따라서 수정은 간단했습니다.

[HttpDelete]
public bool DeleteProgramme(int id)
{
    ...
}

그리고 모든 것이 좋습니다. 정말 어리석은 실수이지만 디버그하기는 어렵습니다.


답변

으로 메서드를 장식 하는 경우 컨트롤러 상단에 HttpGet다음 using을 추가합니다 .

using System.Web.Http;

를 사용하는 System.Web.Mvc경우이 문제가 발생할 수 있습니다.


답변

이것은 확실히 Beta에서 RC 로의 변경입니다. 질문에 제공된 예제에서 이제 [HttpGet] 또는 [AcceptVerbs ( “GET”)]로 작업을 장식해야합니다.

이것은 동사 기반 동작 (예 : “GetSomething”, “PostSomething”)을 동사 기반이 아닌 동작과 혼합하려는 경우 문제를 일으 킵니다. 위의 속성을 사용하려고하면 컨트롤러의 동사 기반 작업과 충돌이 발생합니다. arount를 얻는 한 가지 방법은 각 동사에 대해 별도의 경로를 정의하고 기본 동작을 동사 이름으로 설정하는 것입니다. 이 접근 방식은 API에서 하위 리소스를 정의하는 데 사용할 수 있습니다. 예를 들어 다음 코드는 “/ resource / id / children”을 지원합니다. 여기서 id와 children은 선택 사항입니다.

        context.Routes.MapHttpRoute(
           name: "Api_Get",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Get" },
           constraints: new { httpMethod = new HttpMethodConstraint("GET") }
        );

        context.Routes.MapHttpRoute(
           name: "Api_Post",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Post" },
           constraints: new { httpMethod = new HttpMethodConstraint("POST") }
        );

향후 Web API 버전에서이 시나리오를 더 잘 지원할 수 있기를 바랍니다. 현재 aspnetwebstack codeplex 프로젝트, http://aspnetwebstack.codeplex.com/workitem/184 에 기록 된 문제가 있습니다 . 이것이 당신이보고 싶은 것이 있다면, 이슈에 투표하십시오.


답변

OP와 동일한 설정을 갖습니다. 많은 동작을 가진 하나의 컨트롤러 … 덜 “지저분 함”:-)

제 경우에는 새 작업을 추가 할 때 “[HttpGet]”을 잊어 버렸습니다.

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}


답변

위와 같은 문제이지만 뿌리가 크게 다릅니다. 저에게는 https 재 작성 규칙을 사용하여 엔드 포인트에 도달하는 것이 었습니다. http에서 치면 오류가 발생했으며 https에서 예상대로 작동했습니다.