2013-03-04 7 views
18

Ich habe diese Zeile CodeHolen Antwort von PostAsJsonAsync

var response = new HttpClient().PostAsJsonAsync(posturi, model).Result; 

Der Called WebAPI Controller gibt einen bool um sicherzustellen, dass das Objekt gespeichert wurde, aber wie komme ich, dass Bool Antwort?

+0

Verwenden Sie den Debugger, um das Antwortobjekt zu untersuchen. Bekommen Sie auch Fiddler, um zu sehen, was gepostet und empfangen wird. Verwenden Sie auch await - anstatt .Response, wenn Sie dies asynchron verwenden möchten. – niico

Antwort

43

weiter von Inhalt erhalten:

var httpClient = new HttpClient(); 
var response = httpClient.PostAsJsonAsync(posturi, model).Result; 
bool returnValue = response.Content.ReadAsAsync<bool>().Result; 

Aber dies ist wirklich naiv Ansatz für eine schnelle Art und Weise Ergebnis zu erhalten. PostAsJsonAsync und ReadAsAsync nicht ausgelegt sind wie dies zu tun, werden sie async await Programmierung zur Unterstützung entworfen, so sollten Sie den Code sein:

var httpClient = new HttpClient(); 
var response = await httpClient.PostAsJsonAsync(posturi, model); 
bool returnValue = await response.Content.ReadAsAsync<bool>(); 

Auch stattdessen eine Flagge mit, ob ein Objekt zu überprüfen, die Sie gespeichert ist oder nicht sollte HTTP-Codes verwenden, indem Sie 200 OK zurückgeben, um zu bestimmen, dass das Speichern erfolgreich ist.

+0

Lee, für diese besondere Situation gibt es eine sehr spezifische, warum ich nicht in diesem Fall bin –

+2

Warum '.Result' und Blockierung statt' 'erwarten'? –

3

Wenn Sie die generische Version aufrufen, sollte es geben Ihnen die Bool zurück:

var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result; 

Mindestens nach the docs.

+1

Ich denke, betrifft die Anfrage, nicht die Antwort. – Timmerz

10

Seit seiner ein Async Betrieb nicht sofort tun .RESULT als falsch

Stattdessen müssen Sie es tun async dies tun:

var Httpclient = new Httpclient()

var task = httpClient.PostAsJsonAsync(posturi, model) 
         .ContinueWith(x => x.Result.Content.ReadAsAsync<bool>().Result); 

    // 1. GETTING RESPONSE - NOT ASYNC WAY 
    task.Wait(); //THIS WILL HOLD THE THREAD AND IT WON'T BE ASYNC ANYMORE! 
    bool response = task.Result 

    // 2. GETTING RESPONSE - TASK ASYNC WAY (usually used in < .NET 4.5 
    task.ContinueWith(x => { 
           bool response = x.Result 
          }); 

    // 3. GETTING RESPONSE - TASK ASYNC WAY (usually used in >= .NET 4.5 
    bool response = await task; 

HINWEIS: Ich habe sie nur hier geschrieben, also habe ich sie nicht wirklich getestet, aber mehr oder weniger ist das was du willst.

Ich hoffe, es hilft!

+1

Ich würde empfehlen, den httpClient nicht in eine using-Anweisung einzufügen - https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Xander

3

Ich habe HttpStatusCode verwendet, um das Ergebnis zu überprüfen.

public HttpStatusCode PostStaffPositions(Foo foo) 
    { 
     string uri = myapiuri; 

     using (HttpClient httpClient = new HttpClient()) 
     { 
      var response = httpClient.PostAsJsonAsync(uri, foo).Result; 
      return response.StatusCode; 
     } 
    } 

Und dann in-Controller überprüfen Sie es wie folgt aus:

HttpStatusCode update = staffrest.PostStaffPositions(foo); 
      if (update == HttpStatusCode.OK) 
      { 
       //Update Succeed 
      } 
      else 
      { 
       //Update Failed 
      } 
28

Die akzeptierte Antwort ist technisch korrekt, aber blockiert den aktuellen Thread auf Anrufe zu .Result. Wenn Sie .NET 4.5 oder höher verwenden, sollten Sie dies in fast allen Situationen vermeiden. Stattdessen verwenden die entsprechende asynchrone (nicht-blockierend) Version:

var httpClient = new HttpClient(); 
var response = await httpClient.PostAsJsonAsync(posturi, model); 
bool returnValue = await response.Content.ReadAsAsync<bool>(); 

anzumerken, dass das Verfahren den obigen Code enthält async markiert werden muss, und sollte selbst await ed sein.