c# - HttpClient.DeleteAsync 和 Content.ReadAdStringAsync 总是返回 null

标签 c# rest httpclient json.net async-await

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

我对 GETPOSTPUT 进行了同样的尝试 - 它们总是返回一些结果。

这是我的代码:

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/

相关文章:

c# - 获取嵌套属性及其父项的全名

c# - 拆分功能的正确方法

c# - 如何在 C# 中使用 XPath 获取 SelectedNode 的计数?

httpclient - 如何从 Apache HttpClient 4.x 获取 cookie?

c# - 在 await 锁定期间 sleep 的正确方法

c# - 如何在 Windows Phone 中不使用 GPS 获取位置

git - 使用 REST 克隆 github 存储库

rest - 如何通过 Rest Service 使用 Kotlin/Jvm 将图像上传到 Parse Server?

rest - 使用REST api的Guid token 而不是用户名/密码进行基本身份验证

asp.net - 在 Net Framework 上编写的应用程序中使用 WinHttpHandler 与 HttpClientHandler