当我在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 时返回正文。
您的代码从不检查状态代码的消息响应。与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
标头没有任何区别
我有同样的情况...现在我不知道 DeleteAsync 的方法重载,它接受 post 等内容参数。所以我将 API 从删除切换到发布。
你知道吗:
base_address + relative_address
"http://www.youdomain.com/myservice/" + "/test" = "/test".
这就是为什么你一无所获