2013-08-03 2 views
10

POST에서 페이로드로 사용자 이름과 암호를 받아 들여야하는 다음 컨트롤러가 있습니다. 내가 HttpGet으로 변경하면 작동한다.WebAPI - WebAPI Cors에서 속성 라우팅 POST가 작동하지 않습니까?

[RoutePrefix("api")] 
public class AccountController : ApiController 
{ 
    [HttpPost("login/{username}/{password}")] 
    [AcceptVerbs("POST")] 
    public Login Login(string username, string password) 
    { 
     Login login = new Login(); 
     if (username == "user" && password == "pw") login.Success = true; 
     else login.Success = false; 
     return login; 
    } 
} 

OPTIONS 요청은 통과 할 수 있지만 POST가 실패합니다.

enter image description here

OPTIONS 헤더 :

enter image description here

OPTIONS 응답 :

enter image description here

POST 헤더 :

POST 응답 :

enter image description here

내가 잘못 어떤 생각?

답변

14

당신은 [HttpPost("login/{username}/{password}")]와 경로를 정의하지만 URL에 usename과 암호를 전송하지 않지만 요청 본문에 경로가 너무 일치하지 않는 당신은 당신이 필요로하는 404

을 따라서 얻을 수 있도록 고정 교류를위한 그래서

public class LoginInfo { 
    public string username { get; set; } 
    public string password { get; set; } 
} 

: 그것 때문에 당신이 복잡한 형식이 필요 있도록 요청 본문에서 오는 여러 액션 인수를 가질 수 없습니다 Web.API 작동하지 않습니다 자체에서 [HttpPost("login")]

로 경로를 변경 다음과 같이 표시되어야합니다.

[HttpPost("login")] 
[AcceptVerbs("POST")] 
public Login Login(LoginInfo loginInfo) 
{ 
    Login login = new Login(); 

    if (loginInfo.username == "user" && loginInfo.password == "pw") { 
     login.Success = true; 
    } else { 
     login.Success = false; 
    } 

    return login; 
} 
+0

나는 이것을 바로 시도 할 것이다. 그러나 시나리오 5 [HttpPost ("my/action1/{param1}/{param2"}]가 작동해야합니다. https://aspnetwebstack.codeplex.com/wikipage?title=Attribute%20routing%20in%20Web% 20API – niklr

+0

그렇다면 param1과 param2가 모두 URL에서 온 것이기 때문에 작동해야합니다. 귀하의 경우처럼 요청 본문이 아닙니다. – nemesv

+1

왜 HttpPost를 사용합니까? 나 한테는 말이 안돼. – niklr