当我在 HttpClient
(System.Net.Http) 中使用 DeleteAsync
函数并使用 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);
我总是返回 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 时必须返回 body。
最佳答案
您的代码从不检查 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 上运行以下命令,返回一个正文:
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
header 没有任何区别
关于c# - HttpClient.DeleteAsync 和 Content.ReadAdStringAsync 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17640666/