HttpResponseMessage से सामग्री / संदेश प्राप्त करना


175

मैं HttpResponseMessage की सामग्री प्राप्त करने की कोशिश कर रहा हूं। यह होना चाहिए: {"message":"Action '' does not exist!","success":false}लेकिन मुझे नहीं पता, इसे HttpResponseMessage से कैसे निकाला जाए।

HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync("http://****?action=");
txtBlock.Text = Convert.ToString(response); //wrong!

इस स्थिति में txtBlock का मान होगा:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Vary: Accept-Encoding
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Date: Wed, 10 Apr 2013 20:46:37 GMT
  Server: Apache/2.2.16
  Server: (Debian)
  X-Powered-By: PHP/5.3.3-7+squeeze14
  Content-Length: 55
  Content-Type: text/html
}

जवाबों:


66

आपको GetResponse () कॉल करना होगा ।

Stream receiveStream = response.GetResponseStream ();
StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
txtBlock.Text = readStream.ReadToEnd();

33
धन्यवाद, लेकिन मुझे यह त्रुटि यहां क्यों मिली: "System.Net.Http.HttpResponseMessage 'में' GetResponseStream 'की कोई परिभाषा नहीं है और न ही कोई एक्सटेंशन विधि' GetResponseStream '' Type.Net.ttp.HttpResponseMessage 'के पहले तर्क को स्वीकार करती है। पाया जा सकता है "
क्लेम

13
@Klemzy - क्योंकि आप इसे एसिंक्रोनसली कह रहे हैं। Contentइसके बजाय संपत्ति का उपयोग करने का प्रयास करें । को देखो उदाहरण यहाँ । दूसरे चरण पर स्क्रॉल करें।
आइसमैन्ट

2
@Klemzy - यहां उदाहरण देखें । दूसरे चरण पर स्क्रॉल करें। यदि आप इसका पता नहीं लगा सकते हैं, तो मैं अपने उत्तर को संपादित करूँगा और आपके लिए एक उदाहरण
दूंगा

17
यह उत्तर पूरी तरह से विषय है, ओपी उपयोग कर रहा है HttpClient, नहीं HttpWebRequest/ HttpWebResponse
मैक्सिम रॉसिनी

1
प्रश्न HttpCient के संबंध में है, आपकी प्रतिक्रिया पुरानी और अप्रचलित HttpWebRequest पर आधारित है।
पेम

370

मुझे लगता है कि सबसे आसान तरीका सिर्फ आखिरी लाइन को बदलना है

txtBlock.Text = await response.Content.ReadAsStringAsync(); //right!

इस तरह आपको किसी भी स्ट्रीम पाठकों को पेश करने की आवश्यकता नहीं है और आपको किसी भी विस्तार के तरीकों की आवश्यकता नहीं है।


5
यह सुनिश्चित नहीं है कि यह स्वीकृत उत्तर क्यों नहीं है, विशेष रूप से क्योंकि यह आपको अपनी वस्तुओं में सामग्री को आसानी से अनुक्रमित करने की क्षमता देता है।
जेसन मैककिंडली

3
ReadAsStringAsync त्रुटियों को अच्छी तरह से संभाल नहीं करता है IMHO।
स्टैनियस

16
आप Response.Content.ReadAsStringAsync () का उपयोग भी कर सकते हैं। प्रतीक्षा करने के बजाय परिणाम
जस्टिन

8
हालांकि खबरदार: ReadAsStringAsync () फेंक सकते हैं यदि आपके पास प्रतिक्रिया में इमोटिकॉन्स या कुछ अन्य यूनिकोड वर्ण हैं। मुझे इसे पार करने के लिए धाराओं (जैसे स्वीकृत उत्तर में) का उपयोग करना पड़ा।
जिन्कगो

41

इसे आज़माएं, आप इस तरह से एक एक्सटेंशन विधि बना सकते हैं:

    public static string ContentToString(this HttpContent httpContent)
    {
        var readAsStringAsync = httpContent.ReadAsStringAsync();
        return readAsStringAsync.Result;
    }

और फिर, सरल कॉल एक्सटेंशन विधि:

txtBlock.Text = response.Content.ContentToString();

उम्मीद है इससे आपको मदद होगी ;-)


अब तक सबसे आसान उठना और चलाना
Aage

कृपया awaitइसके बजाय .Result... का उपयोग करें या इसके बजाय एक तुल्यकालिक HTTP क्लाइंट का उपयोग करें, यदि आपका कोड async प्रोग्रामिंग को संभाल नहीं सकता है। लेकिन कोई भी आधुनिक कोड होना चाहिए, अन्यथा यह एक संकेत हो सकता है कि आपका आवेदन कुछ गलत कर रहा है।
मैक्सिम रॉसिनी

9

यदि आप इसे विशिष्ट प्रकार (जैसे परीक्षणों के भीतर) में डालना चाहते हैं, तो आप ReadAsAsync एक्सटेंशन विधि का उपयोग कर सकते हैं :

object yourTypeInstance = await response.Content.ReadAsAsync(typeof(YourType));

या तुल्यकालिक कोड के लिए निम्नलिखित:

object yourTypeInstance = response.Content.ReadAsAsync(typeof(YourType)).Result;

अद्यतन: ReadAsAsync का सामान्य विकल्प भी है <> जो वस्तु-घोषित एक के बजाय विशिष्ट प्रकार का उदाहरण देता है:

YourType yourTypeInstance = await response.Content.ReadAsAsync<YourType>();

2
ऑब्जेक्ट yourTypeInstance = प्रतिक्रिया का इंतजार करें ।Content.ReadAsAsync (टाइपोफ़ (YourType)); var yourTypeInstance = wait response होना चाहिए ।Content.ReadAsAsync <YourType> ();
थॉमस।

मैंने Json को पार्स करने के लिए Request.Content.ReadAsAsync का उपयोग किया और भयानक प्रदर्शन प्राप्त किया।
डब्ल्यूटीओ

4

रुदिवोन्स्टेन के जवाब से

`txtBlock.Text = await response.Content.ReadAsStringAsync();`

लेकिन अगर आप विधि का उपयोग नहीं करना चाहते हैं तो आप उपयोग कर सकते हैं

`txtBlock.Text = response.Content.ReadAsStringAsync();
 txtBlock.Text.Wait();`

प्रतीक्षा करें () यह महत्वपूर्ण है, क्योंकि हम async ऑपरेशंस कर रहे हैं और आगे बढ़ने से पहले हमें कार्य पूरा होने की प्रतीक्षा करनी चाहिए।


3
.Resultकिसी भी अलग का उपयोग कर ?,httpContent.ReadAsStringAsync().Result
mkb

.Resultउस पंक्ति पर थ्रेड का निष्पादन ब्लॉक करेगा ... जहां txtBlock.Text.Wait()प्रतीक्षा () कॉल पर ब्लॉक के रूप में ... तो आप सही हैं कि मूल रूप से कोई अंतर नहीं है। लेकिन मुझे संदेह है txtBlock.Text.Wait()कि एक वैकल्पिक पूर्णांक पैरामीटर लिया जाएगा ताकि पिछले ReadAsStringAsync()कॉल कभी वापस न आए तो GUI लटका न हो । उदाहरण के लिए निम्नलिखित 1 सेकंड से अधिक नहीं के लिए ब्लॉक करेगाtxtBlock.Text.Wait(1000)
बेहोरगेन

3

मेरा सुझाव है कि त्वरित उत्तर है:

response.Result.Content.ReadAsStringAsync().Result


Resultकार्यों पर कॉल न करें । आप अपने आवेदन को लॉक करने का जोखिम उठाते हैं। इसके बजाय async / प्रतीक्षा का उपयोग करें।
एल्टियारे

मैं कभी नहीं कहूंगा ... कभी-कभी जल्दी और गंदा हो जाता है। लेकिन मैं मानता हूं कि आप ReadAsStringAsync()वापसी नहीं करने का जोखिम उठाते हैं , इसलिए सुनिश्चित करें कि इसे अपने जीयूआई या मुख्य एप्लिकेशन थ्रेड पर कॉल न करें।
बेहरजेन

1

मुझे लगता है कि निम्न छवि उन लोगों के लिए मदद करती है जो Tरिटर्न प्रकार के रूप में आते हैं।

यहां छवि विवरण दर्ज करें


0

आप GetStringAsyncविधि का उपयोग कर सकते हैं :

var uri = new Uri("http://yoururlhere");
var response = await client.GetStringAsync(uri);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.