2014-10-27 4 views
46

मैं यह पता लगाने की कोशिश कर रहा हूं कि httpclient कॉल की सामग्री को कैसे पढ़ा जाए, और मुझे यह प्रतीत नहीं होता है। मुझे मिलने वाली प्रतिक्रिया स्थिति 200 है, लेकिन मैं यह नहीं समझ सकता कि वास्तविक जेसन को वापस कैसे किया जा सकता है, जो मुझे चाहिए!httpclient कॉल से सामग्री निकाय कैसे प्राप्त करें?

के बाद मेरे कोड है:

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

और मैं यह सिर्फ एक विधि से बुला हो रही है:

Task<string> result = GetResponseString(text); 

और यह मैं क्या मिलता है

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>

अद्यतन: यह है मेरे वर्तमान कोड नाथन की प्रतिक्रिया प्रति

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

और मैं इस विधि से इसे कहते नीचे ....

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

और यह हमेशा के लिए चल रहता है, यह var model = JsonConvert.DeserializeObject<SentimentJsonModel>(result.Result); एक बार लाइन मारता है, और यह जारी है एक और ब्रेकपॉइंट पर रोक के बिना जाने के लिए।

जब मैं निष्पादन रोकते हैं, यह कहना

आईडी = अभिव्यक्ति का मूल्यांकन नहीं कर सकता क्योंकि वर्तमान पद्धति का कोड अनुकूलित है।, स्थिति = अभिव्यक्ति का मूल्यांकन नहीं कर सकता क्योंकि वर्तमान पद्धति का कोड अनुकूलित है।, विधि = अभिव्यक्ति का मूल्यांकन नहीं कर सकता क्योंकि वर्तमान विधि का कोड अनुकूलित किया गया है। परिणाम = अभिव्यक्ति का मूल्यांकन नहीं कर सकता क्योंकि वर्तमान विधि का कोड अनुकूलित किया गया है।

.. मैं निष्पादन जारी रखता हूं, लेकिन यह हमेशा के लिए चलता है। सुनिश्चित नहीं है कि समस्या

+0

_numRetries कहां और कैसे परिभाषित किया गया है? –

+0

कक्षा के दायरे में और कन्स्ट्रक्टर में 0 के साथ शुरू किया गया है। विश्लेषण Single() एकमात्र जगह है जिसका मैं उपयोग करता हूं। –

+0

क्या आप डीबग मोड में चल रहे हैं? अनुकूलित समस्या हो सकती है क्योंकि आप रिलीज़ मोड में चल रहे हैं। –

उत्तर

80

जिस तरह से आप प्रतीक्षा/async का उपयोग कर रहे हैं वह सबसे खराब है, और इसे अनुपालन करना मुश्किल हो जाता है। आप await को Task'1.Result के साथ मिश्रित कर रहे हैं, जो कि केवल भ्रमित है। हालांकि, ऐसा लगता है कि आप सामग्री के बजाए अंतिम कार्य परिणाम देख रहे हैं।

मैं अपने समारोह और समारोह कॉल है, जो आपकी समस्या का समाधान करना चाहिए फिर से लिख दिया:

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

और अपने अंतिम समारोह कॉल:

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

या और भी बेहतर:

var finalResult = await GetResponseString(text); 
+0

धन्यवाद वर्तमान में कर रहा हूँ !! मैं कैसे async/पिछले कुछ घंटे (MSDN + stackoverflow) के लिए काम करता है का इंतजार करने की कोशिश कर रहा हूँ, लेकिन मैं स्पष्ट रूप से अभी तक पूरी तरह यह समझा नहीं किया है। क्या कोई संसाधन है जो आप सुझाएंगे? –

+0

बस इसके साथ खेलना जारी रखें और आपको अंततः इसका लटका मिल जाएगा। यह सब एक बार में समझने के लिए एक बड़ी अवधारणा है। –

+0

मुझे अभी भी समस्याएं हैं। मैंने मूल पोस्ट पर अपनी समस्या अपडेट की। मुद्दा हो सकता है कि मैं तुल्यकालिक निष्पादन के लिए कोडिंग रहा हूँ, लेकिन मैं यकीन है कि कैसे है कि समस्या –

32

यदि आप async का उपयोग नहीं करना चाहते हैं तो आप .Result को बल में जोड़ सकते हैं कोड को सिंक्रनाइज़ करने के लिए कोड:

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

यूआई थ्रेड से बुलाए जाने पर यह कोड डेडलॉक का कारण बन सकता है। –

+0

@nbushnell अपने PostAsync को .Result जोड़ने यह गैर async बनाता है – Mike

संबंधित मुद्दे