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 は失敗します。

ここに画像の説明を入力

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 に答える