2014-10-27 14 views
46

Tôi đã cố gắng tìm ra cách đọc nội dung của cuộc gọi httpclient và tôi dường như không thể hiểu được. Tình trạng phản ứng tôi nhận được là 200, nhưng tôi không thể tìm ra cách để có được Json thực sự được trả lại, đó là tất cả những gì tôi cần!Cách lấy nội dung từ cuộc gọi httpclient?

Sau đây là mã của tôi:

 async Task<string> GetResponseString(string text) 
    { 
     var httpClient = new HttpClient(); 

     var parameters = new Dictionary<string, string>(); 
     parameters["text"] = text; 
     Task<HttpResponseMessage> response = httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); 

     return await response.Result.Content.ReadAsStringAsync(); 
    } 

Và Tôi nhận được nó chỉ gọi nó từ một phương pháp:

Task<string> result = GetResponseString(text); 

Và Đây là những gì tôi nhận được

response Id = 89, Status = RanToCompletion, Method = "{null}", Result = "StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:\r\n{\r\n Connection: keep-alive\r\n Date: Mon, 27 Oct 2014 21:56:43 GMT\r\n ETag: \"5a266b16b9dccea99d3e76bf8c1253e0\"\r\n Server: nginx/0.7.65\r\n Content-Length: 125\r\n Content-Type: application/json\r\n}" System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>

Cập nhật: Đây là mã hiện tại của tôi mỗi câu trả lời của Nathan dưới

  async Task<string> GetResponseString(string text) 
    { 
     var httpClient = new HttpClient(); 

     var parameters = new Dictionary<string, string>(); 
     parameters["text"] = text; 

     var response = await httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); 
     var contents = await response.Content.ReadAsStringAsync(); 

     return contents; 
    } 

Và tôi gọi nó là từ phương pháp này ....

string AnalyzeSingle(string text) 
    { 
     try 
     { 
      Task<string> result = GetResponseString(text); 
      var model = JsonConvert.DeserializeObject<SentimentJsonModel>(result.Result); 

      if (Convert.ToInt16(model.pos) == 1) 
      { 
       _numRetries = 0; 
       return "positive"; 
      } 

      if (Convert.ToInt16(model.neg) == 1) 
      { 
       _numRetries = 0; 
       return "negative"; 
      } 

      if (Convert.ToInt16(model.mid) == 1) 
      { 
       _numRetries = 0; 
       return "neutral"; 
      } 

      return ""; 

     } 
     catch (Exception e) 
     { 
      if (_numRetries > 3) 
      { 
       LogThis(string.Format("Exception caught [{0}] .... skipping", e.Message)); 
       _numRetries = 0; 
       return ""; 
      } 
      _numRetries++; 
      return AnalyzeSingle(text); 
     } 
    } 

Và nó tiếp tục chạy mãi mãi, Nó hits dòng var model = JsonConvert.DeserializeObject<SentimentJsonModel>(result.Result); Một lần, và nó tiếp tục đi mà không dừng lại ở điểm dừng khác.

Khi tôi tạm dừng thi công, Nó nói Id

= Không thể đánh giá biểu hiện vì mã của phương pháp hiện hành được tối ưu hóa., Tình trạng = có thể không đánh giá biểu hiện vì mã của phương pháp hiện hành được tối ưu hóa., Phương pháp = Không thể đánh giá biểu thức vì mã của phương thức hiện tại được tối ưu hóa., Result = Không thể đánh giá biểu thức vì mã của phương thức hiện tại được tối ưu hóa.

.. Tôi tiếp tục thực hiện, nhưng nó chỉ chạy mãi mãi. Không chắc chắn vấn đề là gì:

+0

_numRetries được định nghĩa ở đâu và như thế nào? –

+0

Trong phạm vi của lớp và được khởi tạo với giá trị 0 trong hàm tạo. AnalyseSingle() là nơi duy nhất tôi sử dụng nó. –

+0

Bạn có đang chạy ở chế độ Gỡ lỗi không? Vấn đề được tối ưu hóa có thể là do bạn đang chạy trong chế độ Phát hành. –

Trả lời

80

Cách bạn đang sử dụng đang chờ/không đồng bộ là người nghèo nhất và khó thực hiện theo. Bạn đang trộn await với Task'1.Result, điều này chỉ gây nhầm lẫn. Tuy nhiên, có vẻ như bạn đang xem kết quả nhiệm vụ cuối cùng, chứ không phải là nội dung.

Tôi đã viết lại chức năng và chức năng của bạn gọi, mà phải khắc phục sự cố:

async Task<string> GetResponseString(string text) 
{ 
    var httpClient = new HttpClient(); 

    var parameters = new Dictionary<string, string>(); 
    parameters["text"] = text; 

    var response = await httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); 
    var contents = await response.Content.ReadAsStringAsync(); 

    return contents; 
} 

Và chức năng cuộc gọi cuối cùng của bạn:

Task<string> result = GetResponseString(text); 
var finalResult = result.Result; 

Hoặc thậm chí tốt hơn:

var finalResult = await GetResponseString(text); 
+0

Cảm ơn !! Tôi đã cố gắng để có được như thế nào async/chờ đợi hoạt động trong vài giờ qua (MSDN + stackoverflow), nhưng tôi rõ ràng đã không nắm bắt nó hoàn toàn được nêu ra. Có bất kỳ tài nguyên nào bạn đề xuất không? –

+0

Chỉ cần tiếp tục chơi với nó và bạn sẽ nhận được hang của nó cuối cùng. Đó là một khái niệm lớn để nắm bắt tất cả cùng một lúc. –

+0

Tôi vẫn gặp sự cố. Tôi đã cập nhật sự cố của mình lên bài đăng gốc. Vấn đề có thể là tôi đang mã hóa để thực hiện đồng bộ, nhưng Im không chắc chắn làm thế nào để giải quyết vấn đề đó –

32

Nếu bạn không muốn sử dụng async bạn có thể thêm .Result để buộc mã để thực hiện đồng bộ:

private string GetResponseString(string text) 
    { 
     var httpClient = new HttpClient(); 

     var parameters = new Dictionary<string, string>(); 
     parameters["text"] = text; 

     var response = httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)).Result; 
     var contents = response.Content.ReadAsStringAsync().Result; 

     return contents; 
    } 
+0

Mã này có thể gây ra bế tắc nếu được gọi từ chuỗi giao diện người dùng. –

+0

@nbushnell thêm .Result vào PostAsync của bạn làm cho nó không phải là không đồng bộ – Mike

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