2013-07-14 42 views
5

当我使用HttpClient(System.Net.Http)DeleteAsync功能和检索Content.ReadAsStringAsync()内容我总是得到null返回。HttpClient.DeleteAsync和Content.ReadAdStringAsync总是返回null

我试过GET,POSTPUT - 他们总是返回一些结果。

这里是我的代码:

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返回。

然而,这一切的工作原理:

GET:

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

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

PUT:

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。

+0

您是否尝试过使用[菲德勒(http://fiddler2.com/)看电线上发生了什么? –

+1

不应该在结果上有所作为,但是有什么理由阻止(在'DeleteAsync'上调用'.Result')而不是等待它? – cremor

+0

@cremor新人的错误。 – Gaui

回答

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(); 
    .... 
} 

您也可以拨打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头不作任何区别

+0

更改我的代码以使用'response.EnsureSuccessStatusCode();' - 但这并没有改变任何东西。服务器以200 OK响应。但我总是得到空。 http://pastebin.com/dKb8BfBD – Gaui

+0

你为什么这样做是错的?服务器可能没有发送正文。您应该检查服务器的API以查看它是否返回DELETE上的任何内容。此外,并非所有的REST API都尊重RFCs –

+0

我猜ASP.NET Web API并不尊重它。因为我用来传递数据的方法与POST和PUT完全相同。奇怪的。 – Gaui

0

我有相同的情况下, ...现在我不知道接受像post这样的内容参数的DeleteAsync的方法重载。所以我将API从Delete切换到Post。

+1

我认为切换HTTP动词使用不正确的一个,只是因为一些代码使用它不会工作是不可取的路线。 – atconway

-2

你知道:

base_address + relative_address 

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

这就是为什么你什么也得不到