2012-09-02 3 views
43

MVC4 webapi 베타를 RC로 업데이트 한 이후로 문제에 대한 도움을 요청하는 몇 가지 이전 질문을했습니다. 나는 지금 대부분의 것을 가지고있다. 그러나 여기에서는 내가 이유를 아직 이해할 수 없다.POST를하는 간단한 컨트롤러를 찾지 못했습니다.

이 간단한 컨트롤러에는 POST를 허용하는 컨트롤러와 GET을 허용하는 컨트롤러가 있습니다. HTML 폼에서 요청을 보내 실행하려고하면 POST 컨트롤러가 다음 오류를 반환하는 동안 GET 컨트롤러 만 발견됩니다.

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost/webapi/api/play/test'.", 
    "MessageDetail": "No action was found on the controller 'Play' that matches the name 'test'." 
} 

왜 POST 컨트롤러를 찾을 수 없습니까? 당신이 "간단한"값을 게시 할 때

컨트롤러

public class PlayController : ApiController 
{ 
    [HttpPost] // not found 
    public string Test(string output) 
    { 
     return output; 
    } 

    [HttpGet] // works 
    public string Test2(string output) 
    { 
     return output; 
    } 
} 

HTML 양식

<form action="http://localhost/webapi/api/play/test" method="post"> 
<input type="text" name="output" /> 
<input type="submit" name="submit" /> 
</form> 

<form action="http://localhost/webapi/api/play/test2" method="get"> 
<input type="text" name="output" /> 
<input type="submit" name="submit" /> 
</form> 

답변

87

Web.API 조금 까다 롭고입니다.

당신은 값이 URL에서하지만 게시 된 데이터에서 오는되지 않는다는 것을 알리기 위해 [FromBody] 속성을 사용합니다 : 당신이 더 이상 404을받지 않습니다이 변경으로

[HttpPost] 
public string Test([FromBody] string output) 
{ 
    return output; 
} 

하지만 output는 항상있을 것입니다 Web.Api가 special format에 게시 된 값 (GPT)를 사용하기 때문에 널 (null),합니다 (보내는 간단한 유형 섹션을 찾아) :

둘째, 클라이언트는 다음과 같은 형식으로 값을 전송해야합니다 :

=value

특히 간단한 유형의 경우 이름/값 쌍의 이름 부분이 비어 있어야합니다. 안>

그래서 당신이 모델 유형 만들어야하는 것이 좋습니다 ... 모든 브라우저가 HTML 양식, 을 위해이 기능을 지원하지만 당신은 스크립트에서이 형식을 만듭니다

public class MyModel 
{ 
    public string Output { get; set; } 
} 

[HttpPost] 
public string Test(MyModel model) 
{ 
    return model.Output; 
} 

는 그 다음 기능이 작동을하여 보기를 수정하지 않고 샘플을 가져옵니다.

+3

3 년 후 차임을 할 수 있으면 감사합니다 !! 이것은 방금 몇 시간을 소비 한 문제를 해결했습니다. 이것은 정확히 SO가하는 모든 것입니다. –

+0

webApiConfig.cs와 컨트롤러의 프로 시저 사이에 매개 변수 이름 불일치가있을 때 동일한 오류가 발생했습니다. –

관련 문제