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 请求

Web Api 2 CORS 不适用于 POST

Angular 2 http.post 不适用于 web api

路由不适用于自托管 Web API [重复]

.NET Web API CORS 不适用于所有路由

CORS 不适用于 ASP NET 5 Web Api