1

System.Web.Httpメソッド属性の使用方法がわかりません。Web APIコントローラー (ASP.Net MVC 4)にこのメソッドLogonがあります。Auth

public HttpResponseMessage Logon(string email, string password)
{
    User user = UserSrv.Load(email);

    if (user != null && user.CheckPassword(password))
        return this.Request.CreateResponse<User>(HttpStatusCode.OK, user);    
    else
        return this.Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid username or password");
}

WebApiConfig.csファイルはデフォルトです

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Formatters.Remove(config.Formatters.XmlFormatter);
    }
}

そのまま、GETメソッドは を返します405 method not allowed。PUT、HEAD、および私が試した他のすべての動詞と同様です。ただし、POST404 not foundの場合は、次の JSONで を返します。

{
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:8080/api/Auth/Logon'.",
"MessageDetail": "No action was found on the controller 'Auth' that matches the request."

}

メソッド定義の前に属性を追加する[HttpPost]と、まったく同じ結果が得られます。HttpGetもちろんGETリクエストでもOKです。両方の属性を組み合わせても何も変わりません。POSTリクエストが 正しくルーティングされないのはなぜですか?


編集

Uri がであり、クエリ パラメータがないため、POST要求は一致しません。パラメータとパラメータにhttp://localhost:8080/api/Auth/Logonデフォルト値を設定すると、メソッドが一致します。しかし、MVC はリクエストの内容をアクションのパラメーターに一致させるのに十分賢いと思いました。引数の値を見つけるために、本当にコンテンツ ストリームを読み取る必要がありますか?emailpassword

4

1 に答える 1