2013-08-03 79 views
10

我有以下控制器應該接受用戶名和密碼作爲負載在POST中。如果我將其更改爲HttpGet,它就可以工作。WebAPI - 屬性路由POST不能與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; 
    } 
} 

OPTIONS請求可以通過但POST失敗。

enter image description here

選項首部:

enter image description here

OPTIONS響應:

enter image description here

POST頭:

enter image description here

POST響應:

enter image description here

任何想法,我做錯了嗎?

回答

14

已定義您的路線與[HttpPost("login/{username}/{password}")]但你不送USENAME和密碼的網址,但在請求體讓你的路線不符合,所以你得到404

所以,你需要改變[HttpPost("login")]

你的路線在它本身不會因爲Web.API所以你需要一個複雜的類型,你不能有多個操作的參數請求主體來工作:

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

因此,對於固定的交流應該看起來像這樣:

[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