2013-07-14 16 views
5

Kiedy używam DeleteAsync funkcję w HttpClient(System.Net.Http) i pobrać zawartość z Content.ReadAsStringAsync() zawsze dotrzesz null zwrócone.HttpClient.DeleteAsync i Content.ReadAdStringAsync zawsze zwraca wartość null

Próbowałem tego samego z GET, POST i PUT - i zawsze zwracają pewne wyniki.

Oto mój kod:

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

zawsze dotrzesz null zwrócone.

Jednak to wszystko działa:

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

Ale DeleteAsync() i ReadAsStringAsync() zawsze zwraca mi null.

Zgodnie z RFC należy przywrócić treść po przywróceniu kodu stanu 200 OK.

+0

Czy próbowałeś użyć [Skrzypek] (http://fiddler2.com/), aby zobaczyć co się dzieje na drucie? –

+1

Nie powinno to wpłynąć na wynik, ale z jakiegokolwiek powodu, dlaczego blokujesz (wywołujesz '.Result') na" DeleteAsync "zamiast czekać na niego? – cremor

+0

@ Boker Rookie błąd. – Gaui

Odpowiedz

5

Twój kod nigdy nie sprawdza odpowiedzi na komunikat dla kodu statusu. W przeciwieństwie do WebClient, HttpClient NIE rzuca, gdy kod statusu nie znajduje się w zakresie 2xx.

Założę się, że jeśli sprawdzić wartości HttpResponseMessage.StatusCode/HttpResonseMessage.ReasonPhrase okaże się, że serwer zwrócił kod inny niż 200.

Na przykład:

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

Można również wywołać metodę do EnsureSuccessStatusCode wyjątek, jeśli status odpowiedź nie jest kodem sukces:

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

EDIT

Nawiasem mówiąc, uruchamiając następującą jak na .NET 4.5, zwraca ciała:

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

     } 

dodanie nagłówka Accept nie czyni żadnej różnicy

+0

Zmieniono mój kod, aby użyć 'response.EnsureSuccessStatusCode() ;- ale to nic nie zmieniło. Serwer odpowiada 200 OK. Ale zawsze mam zerową wartość. http://pastebin.com/dKb8BfBD – Gaui

+0

Dlaczego coś jest nie tak? Serwer mógł nie wysłać ciała. Powinieneś sprawdzić interfejs API serwera, aby zobaczyć, czy zwraca coś na DELETE. Poza tym nie wszystkie API REST respektują RFC –

+0

Zgaduję, że ASP.NET Web API go nie szanuje. Ponieważ metoda, której używam do dostarczenia danych, jest dokładnie taka sama jak metoda POST i PUT. Dziwne. – Gaui

0

mam ten sam przypadek ... na razie nie znam przeciążenia metodami DeleteAsync, które akceptują parametry zawartości, takie jak post. Więc przełączam API z Usuń na Opublikuj.

+1

Myślę, że przełączanie czasowników HTTP na niepoprawny, tylko dlatego, że niektóre z nich nie będą działały, nie są wskazane. – atconway

-2

Czy wiesz:

base_address + relative_address 

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

To dlaczego masz nic