ASP.NET Web Api : 요청 된 리소스가 http 메서드 'GET'을 지원하지 않습니다.


92

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

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

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

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

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

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

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

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

답변:


107

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


방금이 문제가 발생했습니다. 수정 해 주셔서 감사합니다. 궁금한 점이 있습니다. 사용자 지정 메서드로이 작업을 수행해야하지만 기본 "Get"메서드는 사용하지 않는 이유는 무엇입니까? 컨트롤러 용 템플릿으로 만든 Get 메서드가 있지만 장식되지 않았습니다. 이것은 Get이라는 이름 때문에 관례에 의한 것입니까?
SelAromDotNet

3
@Josh : 네! 액션 메서드의 이름이 "Get ..."으로 시작하면 GET 메서드로 표시 할 필요가 없습니다. 자세히 알아보기 : asp.net/web-api/overview/web-api-routing-and-actions/…
Jenny O'Reilly

답변에서 제안한대로 수행했지만 이제 Get 및 Post라는 두 호출 모두 Get Action으로 리디렉션됩니다. 도와주세요.
Syed Ali Taqi 2015 년

54

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

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


@ 에릭. 훌륭합니다. 이것이 저에게 효과가 없었던 이유였습니다. 내 행동에 동사가 있었지만 Web.Mvc를 통해 참조되었으므로 작동하지 않았습니다.
dreza 2013 년

좋아요, 당신은 내 일 저장
호세인 Narimani 라드

System.Web.Mvc가 나에게 좋지 않았기 때문에 대단히 감사합니다.
Burak Karakuş

34

이것이 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)
{
    ...
}

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


1
사람이 라우팅 URL을 사용하는 경우, 같은 일을 시도 [경로 ( "{programmeId = programmeId : INT}")]
SREE

1
이것은 나를위한 것이었다. WebApiConfig-> MapHttpRoutes에는-> routeTemplate : "api / {controller} / {id}"가 있으므로 'id'매개 변수를 사용해야합니다.
HockeyJ

1
귀하의 답변은 약간 다른 내 문제를 지적했습니다. 메소드에 대한 [FromUri] 매개 변수의 이름을 변경하고 클라이언트 측에서 업데이트하지 않았습니다
Matus

22

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

using System.Web.Http;

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


5
이것은 사실이며 .NET은 메시지를 명확하게 표시하지 않습니다.
Teoman shipahi

15

이것은 확실히 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 에 기록 된 문제가 있습니다 . 이것이 당신이보고 싶은 것이 있다면, 이슈에 투표하십시오.


8

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

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

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

6

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


3

이 경로에서 다음 코드를 바꿉니다.

경로 :

App_Start => WebApiConfig.cs

암호:

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

1

이것이 OP의 게시물과 관련이있을 수 있는지는 모르겠지만 [HttpGet] 주석이 누락되었으며 @dinesh_ravva 메서드에 명시된대로 기본적으로 HttpPost로 간주되므로 오류가 발생했습니다.


0

내 문제는 반환 된 메시지에 표시되지 않는 null 참조가있는 것처럼 간단했습니다. API를 디버깅하여 확인해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.