2013-08-03 41 views
10

Ich habe den folgenden Controller, der Benutzername und Passwort als Payload in einem POST akzeptieren sollte. Wenn ich es in HttpGet ändere, funktioniert es.WebAPI - Attribut-Routing POST funktioniert nicht mit WebAPI Cors?

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

Die OPTIONS-Anforderung kann übergeben werden, aber POST schlägt fehl.

enter image description here

OPTIONS header:

enter image description here

Antwort OPTIONEN:

enter image description here

Header POST:

enter image description here

POST Antwort:

enter image description here

Jede Idee, was mache ich falsch?

Antwort

14

Sie haben Ihre Route mit [HttpPost("login/{username}/{password}")] definiert, aber du nicht das usename und das Kennwort in der URL, aber in der Anfrage Körper senden, damit Ihre Route nicht mit so erhalten Sie die 404.

So müssen Sie ändern Ihre Route zu [HttpPost("login")]

an sich wird es nicht, weil mit der Arbeit Web.API Sie nicht mehrere Aktion Argumente kommen aus dem Anforderungs Körper haben kann, so dass Sie einen komplexen Typ benötigen:

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

also für feste ac sollte so aussehen:

[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

Ich werde das sofort versuchen. Aber wie Sie hier in Szenario 5 sehen, sollte [HttpPost ("my/action1/{param1}/{param2")] funktionieren: https://aspnetwebstack.codeplex.com/wikipage?title=Attribute%20routing%20in%20Web% 20API – niklr

+0

Ja, das sollte funktionieren, denn in diesem Fall kommen sowohl param1 als auch param2 von der URL und NICHT vom Körper der Anfrage wie in Ihrem Fall. – nemesv

+1

Warum würden Sie dann HttpPost verwenden? Macht keinen Sinn für mich. – niklr