কীভাবে একটি httpclient কল থেকে সামগ্রী বডি পাবেন?


108

আমি কীভাবে কোনও পোস্টক্লিয়েন্ট কলটির বিষয়বস্তু পড়তে পারি তা বোঝার চেষ্টা করেছি এবং আমি এটি পাইনি বলে মনে হচ্ছে। আমি যে প্রতিক্রিয়ার স্থিতি পেয়েছি তা 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); একবার লাইনটি হিট করে এবং এটি অন্য ব্রেকপয়েন্টে না থামিয়েই চলতে থাকে।

যখন আমি মৃত্যুদণ্ড স্থগিত করি, তখন এটি বলে

আইডি = বর্তমান পদ্ধতির কোডটি অনুকূলিত করার কারণে অভিব্যক্তিটি মূল্যায়ন করতে পারে না Status বর্তমান পদ্ধতির কোডটি অনুকূলিত হয়েছে বলে অভিব্যক্তিটি মূল্যায়ন করতে পারে না।

.. আমি মৃত্যুদন্ড কার্যকর করি তবে এটি চিরকাল স্থায়ী হয়। কি সমস্যা সেটি নিশ্চিত না


_NumRetries কোথায় এবং কীভাবে সংজ্ঞায়িত করা হয়?
নাথান এ

এটি ক্লাসের সুযোগে এবং কনস্ট্রাক্টরে 0 দিয়ে শুরু করা হয়। আমি এটি ব্যবহার করার একমাত্র জায়গা অ্যানালাইজিসিংল ()।
শেরম্যান জেটো

আপনি কি ডিবাগ মোডে চলছে? অপ্টিমাইজড সমস্যাটি হতে পারে কারণ আপনি রিলিজ মোডে চলছে।
নাথান

আমি বর্তমানে ডিবাগ / আইসএক্সপ্রেসে আছি
শেরম্যান

উত্তর:


176

আপনি যেভাবে অপেক্ষার / অ্যাসিঙ্কটি ব্যবহার করছেন সেটি সর্বোত্তমভাবে দরিদ্র এবং এটি অনুসরণ করা শক্ত করে তোলে। আপনি মিশ্রিত 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);

ধন্যবাদ !! আমি গত কয়েক ঘন্টা (এমএসডিএন + স্ট্যাকওভারফ্লো) কীভাবে async / অপেক্ষার কাজ করে তা পাওয়ার চেষ্টা করেছি, তবে স্পষ্টতই আমি এখনও এটি পুরোপুরি ধরতে পারি নি। আপনার প্রস্তাবিত কোনও সংস্থান আছে কি?
শেরম্যান জেটো

1
এটির সাথে কেবল খেলা চালিয়ে যান এবং শেষ পর্যন্ত আপনি এটির হ্যাঙ্গ পাবেন। সমস্ত একবারে উপলব্ধি করা এটি একটি বৃহত ধারণা।
নাথান এ

আমার এখনও সমস্যা আছে। আমি আমার সমস্যাটি মূল পোস্টে আপডেট করেছি। সমস্যাটি হতে পারে যে আমি সিঙ্ক্রোনাস মৃত্যুদন্ডের জন্য কোডিং করছি, তবে কীভাবে সমস্যাটি সমাধান করা যায় তা সম্পর্কে আমি নিশ্চিত নই
শেরম্যান জেটো

1
এইচটিটিপিপ্লিয়েন্ট আইডিস্পোজেবল কার্যকর করে, তাই এটি ব্যবহারের বিবৃতিতে মোড়ানো ভাল।
পাইয়াম

2
@ পেয়াম এটি সত্য যে এটি প্রয়োগ করে IDisposableআপনি এটি একটি usingবিবৃতিতে মোড়ানো উচিত নয় । এটি নিয়মের বিরল ব্যতিক্রম। আরও তথ্যের জন্য এই পোস্টটি দেখুন: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
ম্যাকশিউটি

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 যোগ করছেন .আপনার PostAsync এর ফলাফল এটিকে অ-অসম্পূর্ণ করে তোলে
মাইক

6
@ মাইকে কি এনবুশনেল বলছে না? :-)
পোইহাহ

কি জন্য টাইপ response? আমার অনুরূপ কোড রয়েছে তবে আমার responseগ্লোবাল তৈরি করা দরকার , সুতরাং আমার টাইপটি দরকার। ধন্যবাদ।
আজুরস্পট

1
@ অজুরিস্পট: প্রতিক্রিয়াটির ধরণটি হ'ল HTTPResponseMessage।
আরডাব্লুসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.