HttpClientを使用してWebAPIメソッドに対してPUTリクエストを実行しようとしています。ほぼ同じPOSTリクエストが期待どおりに機能しますが、PUTリクエストの結果は400(Bad Request)エラーになります。何が間違っているのかわかりません。
これが私のWebAPIコントローラーコードです。
public HttpResponseMessage Post(object val)
{
Debug.WriteLine(val.ToString());
return new HttpResponseMessage(HttpStatusCode.OK);
}
public HttpResponseMessage Put(int id, object val)
{
Debug.WriteLine(id.ToString(), val.ToString());
return new HttpResponseMessage(HttpStatusCode.OK);
}
そして、これらのメソッドを呼び出そうとするクライアント側のコードを次に示します。POSTリクエストは次のようになります。
var client = new HttpClient();
var content = log.ToJsonContent();
var address = new Uri(_webApiBaseAddress + "logs");
client.PostAsync(address, content).ContinueWith(requestTask =>
{
requestTask.Result.EnsureSuccessStatusCode();
});
そして、機能しないPUTリクエストは次のようになります。
var client = new HttpClient();
var content = log.ToJsonContent();
var address = new Uri(_webApiBaseAddress + "logs/" + jobId);
client.PutAsync(address, content).ContinueWith(requestTask =>
{
requestTask.Result.EnsureSuccessStatusCode();
});
ご覧のとおり、機能を可能な限り削除しましたが、毎回PUTリクエストでエラーが発生します。
ちなみに、RestSharpクライアントを使用してPUTリクエストを正常に行うことができます。このコードは、APIメソッドを正常に呼び出します。
var client = new RestClient(_webApiBaseAddress);
var request = new RestRequest("logs/{id}", Method.PUT);
request.AddUrlSegment("id", jobId.ToString());
request.AddObject(log);
client.Execute(request);
この方法で行うことの問題は、AddObjectを使用して渡したオブジェクトが、コントローラーメソッドに到達したときに文字列になってしまうことです。intを渡す場合、intを取得したいと思います。HttpClientはPOSTメソッドでこれを行うので、それを使用したかったのですが、PUTはエラーをスローします。そのため、残念ながら、完全なソリューションにはならない2つの半ば機能するソリューションで立ち往生しています。これを機能させるために、どちらのパターンについてもフィードバックをいただければ幸いです。
編集:
それは以下に言及されたので、ここに私の.ToJsonContent()
拡張メソッドがあります:
public static StringContent ToJsonContent(this object obj)
{
var converter = new IsoDateTimeConverter();
converter.DateTimeStyles = DateTimeStyles.AdjustToUniversal;
var json = JsonConvert.SerializeObject(obj, converter);
var content = new StringContent(json, Encoding.UTF8, "application/json");
return content;
}