8

(System.Net.Http)DeleteAsyncで関数を使用していて、コンテンツを取得すると、常に返されます。HttpClient Content.ReadAsStringAsync()null

GETPOSTand - で同じことを試しましたが、PUT常に何らかの結果が返されます。

これが私のコードです:

HttpClient _client = new HttpClient();
_client.BaseAddress = new Uri("http://httpbin.org/");
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = _client.DeleteAsync("/delete").Result;
string res = await response.Content.ReadAsStringAsync();
return await JsonConvert.DeserializeObjectAsync<T>(res);

いつもnull返ってきます。

ただし、これはすべて機能します。

得る:

HttpResponseMessage response = _client.GetAsync("/get").Result;
string res = await response.Content.ReadAsStringAsync();
return await JsonConvert.DeserializeObjectAsync<T>(res);

役職:

HttpResponseMessage response = _client.PostAsync("/post", new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")).Result;
string res = await response.Content.ReadAsStringAsync();
return await JsonConvert.DeserializeObjectAsync<T>(res);

置く:

HttpResponseMessage response = _client.PutAsync("/put", new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")).Result;
string res = await response.Content.ReadAsStringAsync();
return await JsonConvert.DeserializeObjectAsync<T>(res);

しかしDeleteAsync()ReadAsStringAsync()常に私を返しますnull

RFCによると、ステータス コード 200 OK を返すときにボディを返す必要があります。

4

3 に答える 3

6

あなたのコードは、StatusCode のメッセージ応答をチェックしません。WebClient とは異なり、StatusCode が 2xx の範囲にない場合、HttpClient はスローしません。

HttpResponseMessage.StatusCode / HttpResonseMessage.ReasonPhraseの値を確認すると、サーバーが 200 以外のコードを返したことがわかります。

例えば:

HttpClient _client = new HttpClient();
_client.BaseAddress = new Uri("http://httpbin.org/");
...
var response = await _client.DeleteAsync("/delete");
if (response.IsSuccessStatusCode)
{
    var result=await response.Content.ReadAsStringAsync();
    ....
}

応答ステータスが成功コードでない場合は、 EnsureSuccessStatusCodeメソッドを呼び出して例外をスローすることもできます。

HttpClient _client = new HttpClient();
_client.BaseAddress = new Uri("http://httpbin.org/");
...
var response = await _client.DeleteAsync("/delete");
response.EnsureSuccessStatusCode();
var result=await response.Content.ReadAsStringAsync();

編集

ちなみに、.NET 4.5 で以下をそのまま実行すると、body が返されます。

        var  _client = new HttpClient();
        _client.BaseAddress = new Uri("http://httpbin.org/");
        var response = await _client.DeleteAsync("/delete");
        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);

        }

ヘッダーを追加しAcceptても違いはありません

于 2013-07-15T12:17:54.863 に答える
0

私は同じケースを持っています...今のところ、投稿などのコンテンツパラメーターを受け入れるDeleteAsyncのメソッドオーバーロードを知りません。そこで、API を Delete から Post に切り替えます。

于 2013-09-09T08:35:29.357 に答える
-2

あなたは知っていますか:

base_address +  relative_address  

"http://www.youdomain.com/myservice/"  + "/test"  = "/test".

これがあなたが何も得られない理由です

于 2013-10-20T23:28:42.580 に答える