8

当我在(System.Net.Http)DeleteAsync中使用函数并检索内容时,我总是会返回。HttpClient 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 时返回正文。

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 上按原样运行以下命令会返回一个正文:

        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 的方法重载,它接受像 post 这样的内容参数。所以我将 API 从删除切换到发布。

于 2013-09-09T08:35:29.357 回答
-2

你知道吗:

base_address +  relative_address  

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

这就是为什么你一无所获

于 2013-10-20T23:28:42.580 回答