WebAPI - 属性路由 POST 不适用于 WebAPI Cors?
Posted
技术标签:
【中文标题】WebAPI - 属性路由 POST 不适用于 WebAPI Cors?【英文标题】:WebAPI - Attribute Routing POST not working with WebAPI Cors? 【发布时间】:2013-08-04 21:48:24 【问题描述】:我有以下控制器,它应该接受用户名和密码作为 POST 中的有效负载。如果我把它改成 HttpGet 就可以了。
[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 失败。
选项标题:
选项响应:
POST 标头:
POST 响应:
知道我做错了什么吗?
【问题讨论】:
【参考方案1】:您已经使用[HttpPost("login/username/password")]
定义了您的路线,但您没有在 url 中而是在请求正文中发送用户名和密码,因此您的路线不匹配,因此您得到 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;
【讨论】:
我马上试试。但正如您在场景 5 中看到的那样 [HttpPost("my/action1/param1/param2")] 应该可以工作:aspnetwebstack.codeplex.com/… 是的,这应该可以工作,因为在这种情况下,param1 和 param2 都来自 URL,而不是像您的情况那样来自请求正文。 那你为什么要使用HttpPost呢?对我来说毫无意义。 因为动作仍然可以做一些改变状态的事情,所以在语义上将动词作为 POST 是有意义的。但是除了 URL 中给出的参数之外,该操作不需要更多参数。 顺便说一句,可以将单个参数传递给 POST 方法,而无需创建复杂类型。您只需要向此参数添加一个 [FromBody] 属性。正如此处所述asp.net/web-api/overview/formats-and-model-binding/… 这不适用于两个参数。以上是关于WebAPI - 属性路由 POST 不适用于 WebAPI Cors?的主要内容,如果未能解决你的问题,请参考以下文章
模型绑定不适用于 ASP.NET Core 2 WebAPI 中的 POST 请求