私の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で動作しています)
ここで何が悪いの?
アクションをPost([FromBody]string schooltypeName)
のように変更します。デフォルトでは、文字列型はUriになります。
更新:
体をただ"Aided"
現在のところ、そうでない場合は逆シリアル化を機能させるためのクラスが必要になります(ex:class School { public string SchoolTypeName { get; set; } }
System.Web.Mvcを使用している場合、コントローラーの上部にあるsing namespaceを参照してください。この問題が発生する可能性があります。
これを使って:
using System.Web.Http;
問題は次のようになります。
起動時のルートが_routes.MapRoute(
_で登録されている場合、postメソッドを_[System.Web.Mvc.HttpPost]
_で修飾する必要があります
起動時のルートが_Routes.MapHttpRoute(
_で登録されている場合、[System.Web.Http.HttpPost]
_でpostメソッドを修飾する必要があります
MapRoute()
を_[System.Web.Http.HttpPost]
_とともに使用すると、動作しません
MapHttpRoute()
を_[System.Web.Mvc.HttpPost]
_とともに使用すると、動作しません
将来の読者のために。この質問を見つけましたが、他の場所で(私の)答えを見つけました。
メソッドを次の属性で装飾しました。
[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;
}
私の答えはここにありました:
使用している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は次のとおりです。
最後に私に役立ったのは、Route
属性を追加し、グローバルに登録されたのと同じルートを繰り返しただけです。