2013-07-14 4 views
5

Wenn ich verwende DeleteAsync Funktion in HttpClient(System.Net.Http) und rufen Sie den Inhalt mit Content.ReadAsStringAsync() ich null zurück immer bekommen.HttpClient.DeleteAsync und Content.ReadAdStringAsync immer null zurück

Ich habe das gleiche mit GET, POST und PUT versucht - und sie immer ein Ergebnis zurückgeben.

Hier ist mein Code:

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

Ich bekomme immer null zurückgegeben.

jedoch all dies funktioniert:

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

Aber DeleteAsync() und ReadAsStringAsync() immer wieder zurückkehren mich null.

Nach RFC müssen Sie Körper zurückgeben, wenn Sie den Statuscode 200 OK zurückgeben.

+0

erhalten Haben Sie [Fiedler] (http://fiddler2.com/) zu verwenden versucht, um zu sehen, Was passiert auf dem Draht? –

+1

Sollte das Ergebnis keinen Unterschied machen, aber einen Grund, warum Sie "DeleteAsync" blockieren (".Result" aufrufen), anstatt darauf zu warten? – cremor

+0

@cremor Anfängerfehler. – Gaui

Antwort

5

Ihr Code überprüft niemals die Nachrichtenantwort für den StatusCode. Im Gegensatz zum WebClient wird HttpClient NICHT ausgelöst, wenn der StatusCode nicht im Bereich von 2xx liegt.

Ich wette, dass, wenn Sie die HttpResponseMessage.StatusCode/HttpResonseMessage.ReasonPhrase Werte überprüfen werden Sie feststellen, dass der Server einen anderen Code als 200 zurück

Zum Beispiel:

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

Sie können auch die EnsureSuccessStatusCode Methode aufrufen zu wirft eine Ausnahme, wenn der Antwortstatus keinen Erfolgscode ist:

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

By the way, laufen die folgenden als auf .NET 4.5 ist, gibt einen Körper:

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

     } 

den Accept Header Hinzufügen macht keinen Unterschied

+0

Ich habe meinen Code geändert, um 'response.EnsureSuccessStatusCode();' zu verwenden - aber das hat nichts geändert. Der Server antwortet mit 200 OK. Aber ich werde immer null. http://pastebin.com/dKb8BfBD – Gaui

+0

Warum denkst du das ist falsch? Der Server hat möglicherweise keine Nachricht gesendet. Sie sollten die API des Servers überprüfen, um zu sehen, ob bei einem DELETE etwas zurückgegeben wird. Außerdem respektieren nicht alle REST-APIs die RFCs. –

+0

Ich vermute, dass die ASP.NET-Web-API dies nicht respektiert. Weil die Methode, die ich verwende, um die Daten zu liefern, genau das gleiche wie POST und PUT ist. Seltsam. – Gaui

0

ich denselben Fall haben ... für den Moment kenne ich keine Methodenüberladung für DeleteAsync, die Content-Parameter wie Post akzeptieren. Also wechsle ich API von Löschen zu Post.

+1

Ich denke, HTTP-Verben zu wechseln, um die falsche zu verwenden, nur weil einige Code mit es nicht funktioniert, ist nicht die empfohlene Route. – atconway

-2

Kennen Sie:

base_address + relative_address 

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

diesem Grund sollten Sie nichts

Verwandte Themen