web-dev-qa-db-ja.com

Web APIがサポートしていないPOSTメソッド

私のWeb APIコントローラには、次のコードを持つ関数があります

       [HttpPost]
        public HttpResponseMessage Post(string schooltypeName)
        {
            _schoolTypeService.RegisterSchoolType(schooltypeName);

            var message = Request.CreateResponse(HttpStatusCode.Created);

            return message;
        }

フィドラーで呼び出しているときにこのエラーが発生します

{"Message":"The requested resource does not support http method 'POST'."}

私のいじるパラメーターは

ヘッダー

User-Agent: Fiddler

Host: myhost:8823

Content-Type: application/json; charset=utf-8

Content-Length: 26

リクエスト本文

{"schooltypeName":"Aided"}

リクエストURLは

http://myhost:8823/SchoolType

(私はURLを設定し、GETはこのURLで動作しています)

ここで何が悪いの?

31
Binson Eldhose

アクションをPost([FromBody]string schooltypeName)のように変更します。デフォルトでは、文字列型はUriになります。

更新
体をただ"Aided"現在のところ、そうでない場合は逆シリアル化を機能させるためのクラスが必要になります(exclass School { public string SchoolTypeName { get; set; } }

50
Kiran Challa

System.Web.Mvcを使用している場合、コントローラーの上部にあるsing namespaceを参照してください。この問題が発生する可能性があります。

これを使って:

using System.Web.Http;
14
Sohail xIN3N

問題は次のようになります。

起動時のルートが_routes.MapRoute(_で登録されている場合、postメソッドを_[System.Web.Mvc.HttpPost]_で修飾する必要があります

起動時のルートが_Routes.MapHttpRoute(_で登録されている場合、[System.Web.Http.HttpPost]_でpostメソッドを修飾する必要があります

MapRoute()を_[System.Web.Http.HttpPost]_とともに使用すると、動作しません

MapHttpRoute()を_[System.Web.Mvc.HttpPost]_とともに使用すると、動作しません

10

将来の読者のために。この質問を見つけましたが、他の場所で(私の)答えを見つけました。

メソッドを次の属性で装飾しました。

    [System.Web.Http.HttpPost]
    public MyOutputObject DoSomething([FromBody]MyInputObject args)
    {
        Console.Writeline(args.ToString());
    }

完全を期すためのクライアントコード(C#、コンソールアプリ)。

    private static Task<MyOutputObject> MyClientCall(string baseAddress, MyInputObject args)
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(baseAddress);
        client.DefaultRequestHeaders.Accept.Add(
           new MediaTypeWithQualityHeaderValue("application/json"));

           /* Your class name would be "MyEntityController" most likely */
        string serviceUrl = baseAddress + @"api/MyEntity/DoSomething";

        HttpResponseMessage response = client.PostAsJsonAsync(serviceUrl, args).Result;

        Console.WriteLine(response);
        Console.WriteLine(response.Content.ReadAsStringAsync().Result);

        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine("ERROR:  :(   " + response.ReasonPhrase);
            return null;
        }
        Task<MyOutputObject> wrap = response.Content.ReadAsAsync<MyOutputObject>();
        return wrap;
    }

私の答えはここにありました:

http://blog.dontpaniclabs.com/post/2013/01/23/That-Pesky-Requested-Resource-Does-Not-Support-HTTP-Method-POST-Error-When-Using-MVC- Web-API

6
granadaCoder

使用しているGETアクションメソッド名を確認してください。 GETメソッドとPOSTメソッドに同じルート名を使用し、結果を期待している可能性があります。

例:

コントローラー名:StudentController

    [Route("api/Student/names")]
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "student1", "student2" };
    }

メソッドのURL(GET): http:// localhost:59342/api/student/names

     [HttpPost]
     [Route("api/Student/names")]
     public String Post(String name)
     {
         return "success";
     }

POST urlへのメソッド: http:// localhost:59342/api/student/names

次に、上記のエラーが表示されます

解決策:POSTアクションメソッド名を以下のように変更します

    [HttpPost]
    [Route("api/Student/getName")]
    public String Post(String name)
    {
        return "success";
    }

次に、postメソッドの応答を取得するために使用されるURLは次のとおりです。

http:// localhost:59342/api/student/getName

1
Thriveni

最後に私に役立ったのは、Route属性を追加し、グローバルに登録されたのと同じルートを繰り返しただけです。

1
Đonny