WebAPI - 属性路由 POST 不适用于 WebAPI Cors? [英] WebAPI - Attribute Routing POST not working with WebAPI Cors?
问题描述
我有以下控制器,它应该接受用户名和密码作为 POST 中的有效负载.如果我把它改成 HttpGet 就可以了.
I have the following controller which should accept username and password as payload in a POST. If I change it to HttpGet it works.
[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 失败.
The OPTIONS request can pass through but POST fails.
选项标题:
选项响应:
POST 标头:
POST 响应:
知道我做错了什么吗?
推荐答案
你已经用 [HttpPost("login/{username}/{password}")]
定义了你的路由,但是你没有'不要在 url 中发送用户名和密码,而是在请求正文中发送,因此您的路由不匹配,因此您得到 404.
You have defined your route with [HttpPost("login/{username}/{password}")]
but you don't send the usename and password in the url but in the request body so your route doesn't match so you get the 404.
所以你需要把你的路由改成[HttpPost("login")]
So you need to change your route to [HttpPost("login")]
它本身是行不通的,因为使用 Web.API,您不能有来自请求正文的多个操作参数,因此您需要一个复杂类型:
In itself it won't work because with Web.API you cannot have multiple action arguments coming from the request body so you need a complex type:
public class LoginInfo {
public string username { get; set; }
public string password { get; set; }
}
所以对于固定动作应该是这样的:
So for fixed action should look like this:
[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;
}
这篇关于WebAPI - 属性路由 POST 不适用于 WebAPI Cors?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!