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!

এই ক্ষেত্রে টেক্সটব্লকের মান হবে:

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
ধন্যবাদ, তবে কেন আমি এই ত্রুটিটি এখানে পেয়েছি: "সিস্টেম.নেট.ইচটিপি.এইচটিপি.সেস্পোনসমেসেসে 'গেটআরস্পোনস্ট্রিম' এর জন্য কোনও সংজ্ঞা নেই এবং 'সিস্টেম.নেট.এইচটিপি.এইচটিপিআরএসপোনসমেসেজ' টাইপের প্রথম যুক্তি স্বীকার করার কোনও গতিপথ পদ্ধতি 'গেটআরস্পোনস্ট্রিম' নেই does পাওয়া
যেত

13
@ ক্লেমিজি - কারণ আপনি এটিকে অ্যাসিঙ্ক্রোনিসলি বলছেন। Contentপরিবর্তে সম্পত্তি ব্যবহার করার চেষ্টা করুন । এখানে উদাহরণ দেখুন । দ্বিতীয় ধাপে নিচে স্ক্রোল করুন।
আইসমানিন্ড

2
@ ক্লেমিজি - উদাহরণটি এখানে দেখুন । দ্বিতীয় ধাপে নিচে স্ক্রোল করুন। যদি আপনি এটি
অনুধাবন

17
এই উত্তরটি পুরোপুরি অফ-টপিক, ওপি ব্যবহার করছে HttpClient, নয় HttpWebRequest/ HttpWebResponse
ম্যাক্সিম রসিনি

1
প্রশ্নটি এইচটিটিপিসিয়েন্ট সম্পর্কিত, আপনার প্রতিক্রিয়া পুরানো এবং অপ্রচলিত এইচটিটিপিওয়েব্রেকয়েস্টের ভিত্তিতে।
পাইম

370

আমি মনে করি সহজতম পন্থাটি কেবলমাত্র সর্বশেষ লাইনে পরিবর্তন করা

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

এইভাবে আপনাকে কোনও স্ট্রিম পাঠক পরিচয় করিয়ে দেওয়ার প্রয়োজন হবে না এবং আপনার কোনও এক্সটেনশন পদ্ধতি প্রয়োজন নেই।


5
কেন এটি গ্রহণযোগ্য উত্তর নয় তা নিশ্চিত নয়, বিশেষত যেহেতু এটি আপনাকে আপনার সামগ্রীতে সহজেই বিষয়বস্তু সিরিয়াল করার ক্ষমতা দেয়।
জেসন ম্যাক কিন্ডালি

3
ReadAsStringAsync ত্রুটিগুলি ভালভাবে পরিচালনা করে না IMHO।
স্ট্যানিয়াস

16
আপনি
জাস্টিন

8
যদিও সাবধান থাকুন: আপনার প্রতিক্রিয়াতে ইমোটিকন বা অন্য কিছু ইউনিকোড অক্ষর থাকলে ReadAsStringAsync () নিক্ষেপ করতে পারে। এটি কাটিয়ে উঠতে আমাকে স্ট্রিমগুলি (গ্রহণযোগ্য উত্তরের মতো) ব্যবহার করতে হয়েছিল।
জিঙ্কগো

41

এটি ব্যবহার করে দেখুন, আপনি এটির মতো একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন:

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

এবং তারপরে, সহজ কলটি এক্সটেনশন পদ্ধতি:

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

আমি আশা করি এটি আপনাকে সাহায্য করবে ;-)


এখন পর্যন্ত উঠতে এবং চালানো সবচেয়ে সহজ
বয়স

দয়া করে awaitপরিবর্তে ব্যবহার করুন .Result... বা তার পরিবর্তে একটি সিঙ্ক্রোনাস এইচটিটিপি ক্লায়েন্ট ব্যবহার করুন, যদি আপনার কোড অ্যাসিঙ্ক প্রোগ্রামিং পরিচালনা করতে না পারে। তবে যে কোনও আধুনিক কোড হওয়া উচিত, অন্যথায় এটি এমন একটি চিহ্ন হতে পারে যা আপনার অ্যাপ্লিকেশনটি কিছু ভুল করছে।
ম্যাক্সিম রসিনি

9

আপনি যদি এটি নির্দিষ্ট ধরণের (যেমন পরীক্ষার মধ্যে) কাস্ট করতে চান তবে আপনি ReadAsAncnc এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন :

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

বা সিঙ্ক্রোনাস কোডের জন্য নিম্নলিখিত:

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

আপডেট: এখানে ReadAsAncnc <> এর জেনেরিক বিকল্প রয়েছে যা অবজেক্ট-ঘোষিত একের পরিবর্তে নির্দিষ্ট ধরণের উদাহরণ দেয়:

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

2
অবজেক্টটি আপনার টাইপআইন্সটেন্স = প্রতিক্রিয়ার জন্য অপেক্ষা করুন on কনটেন্ট.আরএডএএএসএনসিঙ্ক (টাইপফ (আপনার টাইপ)); আপনার টাইপআইনস্ট্যান্স = হওয়া উচিত প্রতিক্রিয়ার জন্য অপেক্ষা করুন on কনটেন্ট.আরআডএএএসএন্সিঙ্ক <ইওর টাইপ> ();
থমাস.বেনজ

আমি জসনকে পার্স করার জন্য অনুরোধ.কম্টন.আরএডএএএসএনসিঙ্ক ব্যবহার করেছি এবং ভয়াবহ অভিনয় পেয়েছি।
ডাব্লু.লাইটো

4

Rudivonstaden এর উত্তর দ্বারা

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

তবে আপনি যদি পদ্ধতিটি অ্যাসিঙ্ক করতে না চান তবে আপনি ব্যবহার করতে পারেন

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

অপেক্ষা করুন () এটি গুরুত্বপূর্ণ, কারণ আমরা অ্যাসিঙ্ক অপারেশন করছি এবং এগিয়ে যাওয়ার আগে আমাদের অবশ্যই কাজটি শেষ হওয়ার জন্য অপেক্ষা করতে হবে।


3
.Resultকোনও আলাদা ব্যবহার করছেন ?,httpContent.ReadAsStringAsync().Result
এমকেবি

.Resultথ্রেডের প্রয়োগটি সেই লাইনে আটকে দেবে ... যেখানে txtBlock.Text.Wait()ওয়েট () কলের ব্লক হিসাবে ... সুতরাং আপনি সঠিক যে মূলত কোনও পার্থক্য নেই। তবে আমার সন্দেহ হয় txtBlock.Text.Wait()aচ্ছিক পূর্ণসংখ্যার প্যারামিটারটি নেবে যাতে পূর্ববর্তী ReadAsStringAsync()কলটি কখনই ফিরে না আসে যদি GUI স্তব্ধ না হয়। উদাহরণস্বরূপ txtBlock.Text.Wait(1000)
নীচেরগুলি

3

আমি যে দ্রুত উত্তরটি প্রস্তাব করছি তা হ'ল:

response.Result.Content.ReadAsStringAsync().Result


Resultকাজগুলিতে কল করবেন না । আপনি আপনার অ্যাপ্লিকেশন লক আপ ঝুঁকিপূর্ণ। পরিবর্তে async / অপেক্ষা করুন।
এলটিয়ার

আমি কখনও বলব না ... কখনও কখনও দ্রুত এবং নোংরা এটি হয়ে যায়। তবে আমি সম্মত হয়েছি আপনি ReadAsStringAsync()ফিরে না আসার ঝুঁকি চালাচ্ছেন , সুতরাং এটি আপনার জিইউআই বা প্রধান অ্যাপ্লিকেশন থ্রেডে কল করবেন না তা নিশ্চিত করুন।
beেনorgen

1

আমি মনে করি যে নিম্নলিখিত চিত্রটি তাদের Tরিটার্নের ধরণ হিসাবে আসতে সাহায্য করে।

এখানে চিত্র বর্ণনা লিখুন


0

আপনি GetStringAsyncপদ্ধতিটি ব্যবহার করতে পারেন :

var uri = new Uri("http://yoururlhere");
var response = await client.GetStringAsync(uri);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.