WebAPI - 属性路由POST不能与WebAPI Cors一起使用?

nik*_*klr 11 post cors asp.net-web-api

我有以下控制器,它应该接受用户名和密码作为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

OPTIONS请求可以通过,但POST失败.

在此输入图像描述

选项标题:

在此输入图像描述

选项回复:

在此输入图像描述

POST标题:

在此输入图像描述

POST响应:

在此输入图像描述

知道我做错了什么吗?

nem*_*esv 14

您已经定义了路线,[HttpPost("login/{username}/{password}")]但是您没有在网址中发送用户名和密码,而是在请求正文中发送,因此您的路线不匹配,因此您获得了404.

所以你需要改变你的路线 [HttpPost("login")]

本身它不会起作用,因为使用Web.API你不能有来自请求体的多个动作参数,所以你需要一个复杂的类型:

public class LoginInfo {
    public string username { get; set; }
    public string password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以对于固定动作应该如下所示:

[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;
}
Run Code Online (Sandbox Code Playgroud)