2013-03-04 39 views
18

Tôi có dòng mã nàyNhận phản hồi từ PostAsJsonAsync

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

Bộ điều khiển WebAPI gọi là trả về một bool để đảm bảo các đối tượng đã được cứu, nhưng làm thế nào để tôi trở lại rằng phản ứng bool?

+0

Sử dụng trình gỡ lỗi để khám phá đối tượng phản hồi. Cũng có được Fiddler để xem những gì đang được đăng và nhận được. Cũng sử dụng await - thay vì .Response nếu bạn muốn sử dụng nó theo cách Async. – niico

Trả lời

43

Tiếp tục nhận từ nội dung:

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

Nhưng, điều này thực sự là cách tiếp cận ngây thơ cho cách nhanh chóng để có được kết quả. PostAsJsonAsyncReadAsAsync không được thiết kế để làm như thế này, chúng được thiết kế để hỗ trợ async await lập trình, do đó, mã của bạn nên là:

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

Ngoài ra, thay vì sử dụng một lá cờ để kiểm tra xem một đối tượng được lưu hay không, bạn nên sử dụng mã HTTP bằng cách trả lại 200 OK để xác định rằng lưu thành công.

+0

Lee, trong trường hợp cụ thể này, có một lý do rất cụ thể tại sao tôi không ở trong trường hợp này –

+2

Tại sao '.Result' và chặn thay vì' await'? –

3

Nếu bạn gọi phiên bản chung chung, nó sẽ cho bạn lại bool:

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

Ít nhất theo the docs.

+1

Tôi nghĩ rằng ảnh hưởng đến yêu cầu chứ không phải phản hồi. – Timmerz

10

Kể từ khi phẫu thuật async của nó không ngay lập tức làm .Result như nó sai

Thay vào đó bạn cần phải làm điều đó async bằng cách làm này:

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; 

LƯU Ý: Tôi chỉ viết chúng ở đây, vì vậy tôi đã không thực sự kiểm tra chúng nhưng nhiều hơn hoặc ít hơn đó là những gì bạn muốn.

Tôi hy vọng điều đó sẽ hữu ích!

+1

Tôi khuyên bạn không nên gói httpClient trong một tuyên bố sử dụng - https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Xander

3

Tôi đã sử dụng HttpStatusCode để kiểm tra kết quả.

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

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

Và sau đó trong bộ điều khiển kiểm tra xem nó như thế này:

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

Câu trả lời được chấp nhận là đúng về mặt kỹ thuật nhưng khối thread hiện hành về các cuộc gọi đến .Result. Nếu bạn đang sử dụng .NET 4.5 hoặc cao hơn, bạn nên tránh điều đó trong hầu hết các tình huống. Thay vào đó, sử dụng đồng bộ tương đương (non-blocking) phiên bản:

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

Lưu ý rằng phương pháp có chứa các mã trên cần phải được đánh dấu async, và bản thân nên await ed.

Các vấn đề liên quan