11

我有以下控制器,它应该接受用户名和密码作为 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 标头:

在此处输入图像描述

发布响应:

在此处输入图像描述

知道我做错了什么吗?

4

1 回答 1

14

您已经定义了您的路线,[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;
}
于 2013-08-03T20:42:15.070 回答