WebAPI - Маршрутизация атрибутов POST не работает с WebAPI Cors?

У меня есть следующий контроллер, который должен принимать имя пользователя и пароль как полезную нагрузку в 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 не работает.

enter image description here

Заголовок OPTIONS:

enter image description here

Ответ OPTIONS:

enter image description here

Заголовок POST:

enter image description here

Ответ POST:

enter image description here

Любая идея, что я делаю неправильно?

Ответ 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;
}