Httpclient कॉल से कंटेंट बॉडी कैसे प्राप्त करें?


108

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

निम्नलिखित मेरा कोड है:

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); एक बार लाइन मारता है , और यह एक और ब्रेकपॉइंट पर बिना रुके चलता रहता है।

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

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

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


_NumRetries कहाँ और कैसे परिभाषित की जाती है?
नाथन ए

वर्ग के दायरे में इसका निर्माण और निर्माणकर्ता में 0 से आरंभ किया जाता है। विश्लेषणशील () एकमात्र ऐसी जगह है जिसका मैं उपयोग करता हूं।
शर्मन स्जेटो

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

मैं इस समय डिबग / iisExpress पर हूँ
शर्मन स्ज़ेटो

जवाबों:


176

जिस तरह से आप प्रतीक्षारत / 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);

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

1
बस इसके साथ खेलते रहो और तुम अंततः इसे लटकाओगे। सभी को एक साथ समझ लेना एक बड़ी अवधारणा है।
नाथन ए

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

1
HttpClient आईडीआईएसओप्लिमेंट को लागू करता है, इसलिए इसे एक उपयोग कथन में लपेटना बेहतर है।
पेम

2
@Pyam, जबकि यह सच है कि यह IDisposableआपको एक usingबयान में लपेट नहीं करना चाहिए लागू करता है। यह नियम का एक दुर्लभ अपवाद है। अधिक जानकारी के लिए यह पोस्ट देखें: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
maxshuty

62

यदि आप उपयोग नहीं करना चाहते हैं तो आप कोड को बलपूर्वक निष्पादित करने के लिए 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;
 }  

2
@nbushnell को जोड़ना। अपने पोस्टएस्क्यू के साथ। इसे गैर-एस्किंक बनाता है
माइक

6
@ मायके यह नहीं है कि nbushnell क्या कह रही है? :-)
पोहाह

किस प्रकार के लिए है response? मेरे पास एक समान कोड है लेकिन मुझे responseवैश्विक बनाने की आवश्यकता है , इसलिए मुझे प्रकार की आवश्यकता है। धन्यवाद।
Azurespot

1
@AzureSpot: De प्रकार की प्रतिक्रिया HttpResponseMessage है।
RWC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.