HttpClient.DeleteAsync和Content.ReadAdStringAsync始终返回null

Gau*_*aui 6 c# rest httpclient json.net async-await

当我DeleteAsyncHttpClient (System.Net.Http)中使用函数并检索内容时,Content.ReadAsStringAsync()我总是null返回.

我已经尝试了相同的GET,POST并且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);
Run Code Online (Sandbox Code Playgroud)

我总是null回来.

但是,所有这些都有效:

得到:

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

POST:

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);
Run Code Online (Sandbox Code Playgroud)

放:

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);
Run Code Online (Sandbox Code Playgroud)

但是DeleteAsync(),ReadAsStringAsync()总是回报我null.

根据RFC,你必须返回状态代码200 OK时返回正文.

Pan*_*vos 5

您的代码从不检查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();
    ....
}
Run Code Online (Sandbox Code Playgroud)

如果响应状态不是成功代码,也可以调用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();
Run Code Online (Sandbox Code Playgroud)

编辑

顺便说一句,在.NET 4.5上运行以下命令,返回一个正文:

        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);

        }
Run Code Online (Sandbox Code Playgroud)

添加Accept标题没有任何区别