আমি কীভাবে এইচটিটিপিপ্লায়েন্টের এইচটিটিপিআরকুয়েস্টমেসেজে একটি কুকি সেট করব


246

আমি ওয়েব এপিআই ব্যবহার করতে চেষ্টা করছি এমন HttpClientএকটি শেষের পয়েন্টে একটি পোস্ট করতে যা কোনও অ্যাকাউন্ট সনাক্ত করতে এইচটিটিপি কুকি আকারে লগইন প্রয়োজন (এটি কেবলমাত্র #ifdefপ্রকাশের সংস্করণ থেকে বেরিয়ে এসেছে)।

আমি কীভাবে একটি কুকি যুক্ত করব HttpRequestMessage?

উত্তর:


374

আপনি কীভাবে অনুরোধের জন্য কাস্টম কুকি মান সেট করতে পারেন তা এখানে:

var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    var content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("foo", "bar"),
        new KeyValuePair<string, string>("baz", "bazinga"),
    });
    cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
    var result = await client.PostAsync("/test", content);
    result.EnsureSuccessStatusCode();
}

2
হ্যান্ডলার বিবৃতি ব্যবহার থেকে অপসারণ করা যেতে পারে, HTTP ক্লায়েন্ট নিষ্পত্তি করা হলে তা নিষ্পত্তি হবে।
কিমি

17
কিমি সঠিক, তবে আপনার ব্যবহারের ক্ষেত্রে আপনার এইচটিটিপিপ্লাইন্টটি মোড়ানো উচিত নয়। aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
রবার্ট

9
সতর্কতা: আপনি যদি বেশ কয়েকটি অনুরোধ করতে HTTPClient এর মাত্র 1 টি উদাহরণ ব্যবহার করেন, কুকি কনটেনার ব্যবহার করে কুকিগুলি ক্যাশে হচ্ছে। অন্য ব্যবহারকারীর কাছ থেকে কুকি পাওয়া কোনও ব্যবহারকারীর পক্ষে বিপজ্জনক।
একাজ সোজা

31
এখান থেকে "HttpClient একবার instantiated করা এবং একটি অ্যাপলিকেশন জীবন সর্বত্র পুনরায় ব্যবহার যে অনুরোধ ভারী লোড অধীন উপলব্ধ সকেট সংখ্যা এক্সস্ট হবে জন্য একটি নতুন HttpClient উদাহরণস্বরূপ তৈরি দেয়ার উদ্দেশ্যে করা হচ্ছে বিশেষ করে সার্ভার অ্যাপ্লিকেশন, ...।": ASP । নেট / ওয়েব-এপিআই / ওভারভিউ / অ্যাডভান্সড / ...
সার্জিটি

4
@ সার্জিটি তাই যখন একই সংস্থায় পৃথক-অধিবেশন কল করার দরকার পড়ে তখন সে কী করবে? :)
এজেন্টফায়ার

336

গৃহীত উত্তর বেশিরভাগ ক্ষেত্রেই এটি করার সঠিক উপায়। তবে এমন কিছু পরিস্থিতি রয়েছে যেখানে আপনি ম্যানুয়ালি কুকির শিরোনাম সেট করতে চান। সাধারণত আপনি যদি "কুকি" শিরোলেখ সেট করেন তবে এটিকে অগ্রাহ্য করা হবে, তবে HttpClientHandlerএটির কারণ এটির CookieContainerসম্পত্তি কুকিগুলির জন্য ব্যবহার করা ডিফল্ট । যদি আপনি এটি অক্ষম করে থাকেন তবে সেট UseCookiesকরে falseআপনি কুকি শিরোনাম ম্যানুয়ালি সেট করতে পারেন এবং তারা অনুরোধে উপস্থিত হবে, যেমন

var baseAddress = new Uri("http://example.com");
using (var handler = new HttpClientHandler { UseCookies = false })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    var message = new HttpRequestMessage(HttpMethod.Get, "/test");
    message.Headers.Add("Cookie", "cookie1=value1; cookie2=value2");
    var result = await client.SendAsync(message);
    result.EnsureSuccessStatusCode();
}

44
আমি বেশ কয়েক দিন ধরে একটি ত্রুটি তাড়া করছি যাতে সেন্ডএন্সিঙ্কের সাথে প্রেরিত অনুরোধগুলি কুকি শিরকটি প্রেরণ করে নি; এটি আমাকে বুঝতে সাহায্য করেছিল যে আপনি হ্যান্ডলারের মধ্যে ইউজকুকিজ = মিথ্যা সেট না করলে এটি কেবল কুকি কনটেনারই ব্যবহার করবে না, অনুরোধ শিরোনামে সঞ্চিত যে কোনও কুকিকে চুপচাপ উপেক্ষা করবে! তোমাকে অনেক ধন্যবাদ!
ফার্নান্দো নীরা

14
এই উত্তরটি যে কারও জন্য প্রক্সি হিসাবে এইচটিপিপিলেট ব্যবহার করার চেষ্টা করছে তার পক্ষে অত্যন্ত সহায়ক!
চেম্বারলাইন

3
এখনই এটি চেষ্টা করে ... যদি এটি কাজ করে ... আপনি একটি ভাল ওল 'কানাডিয়ান আলিঙ্গনের প্রাপ্য।
ম্যাক্সিমাম রুইলার

11
সতর্কতা: আপনি যদি বেশ কয়েকটি অনুরোধ করতে HTTPClient এর মাত্র 1 টি উদাহরণ ব্যবহার করেন, কুকি কনটেনার ব্যবহার করে কুকিগুলি ক্যাশে হচ্ছে। অন্য ব্যবহারকারীর কাছ থেকে কুকি পাওয়া কোনও ব্যবহারকারীর পক্ষে বিপজ্জনক।
একাজ সোজা

9
যখন কেউ নীরবে এটি হারিয়ে না দেওয়ার পরিবর্তে "কুকি" শিরোনাম যুক্ত করার চেষ্টা করে তখন এই নির্বোধ জিনিসটির ব্যতিক্রম হওয়া উচিত। আমার জীবনের এক ঘন্টা আমাকে ব্যয় করুন। সমাধানের জন্য ধন্যবাদ।
স্ট্যাম্যাক্স

5

এই সমস্যাটিতে ঘন্টা ব্যয় করার পরে, উপরের উত্তরগুলির মধ্যে আমার কোনওটিই সহায়তা করেনি তাই আমি একটি সত্যিকারের দরকারী সরঞ্জাম পেয়েছি।

প্রথমত, আমি আমার ওয়েব রিকোয়েস্টগুলি বিশদে অধ্যয়নের জন্য টেলিকের ফিডলার 4 ব্যবহার করি

দ্বিতীয়ত, আমি ফিডলারের জন্য এই দরকারী প্লাগইনটি জুড়ে এসেছি:

https://github.com/sunilpottumuttu/FiddlerGenerateHttpClientCode

এটি কেবল আপনার জন্য সি # কোড উত্পন্ন করবে। একটি উদাহরণ ছিল:

        var uriBuilder = new UriBuilder("test.php", "test");
        var httpClient = new HttpClient();


        var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uriBuilder.ToString());



        httpRequestMessage.Headers.Add("Host", "test.com");
        httpRequestMessage.Headers.Add("Connection", "keep-alive");
     //   httpRequestMessage.Headers.Add("Content-Length", "138");
        httpRequestMessage.Headers.Add("Pragma", "no-cache");
        httpRequestMessage.Headers.Add("Cache-Control", "no-cache");
        httpRequestMessage.Headers.Add("Origin", "test.com");
        httpRequestMessage.Headers.Add("Upgrade-Insecure-Requests", "1");
    //    httpRequestMessage.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
        httpRequestMessage.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
        httpRequestMessage.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
        httpRequestMessage.Headers.Add("Referer", "http://www.translationdirectory.com/");
        httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate");
        httpRequestMessage.Headers.Add("Accept-Language", "en-GB,en-US;q=0.9,en;q=0.8");
        httpRequestMessage.Headers.Add("Cookie", "__utmc=266643403; __utmz=266643403.1537352460.3.3.utmccn=(referral)|utmcsr=google.co.uk|utmcct=/|utmcmd=referral; __utma=266643403.817561753.1532012719.1537357162.1537361568.5; __utmb=266643403; __atuvc=0%7C34%2C0%7C35%2C0%7C36%2C0%7C37%2C48%7C38; __atuvs=5ba2469fbb02458f002");


        var httpResponseMessage = httpClient.SendAsync(httpRequestMessage).Result;

        var httpContent = httpResponseMessage.Content;
        string result = httpResponseMessage.Content.ReadAsStringAsync().Result;

নোট করুন যে আমাকে দুটি লাইন মন্তব্য করতে হয়েছিল কারণ এই প্লাগইনটি এখনও সম্পূর্ণ নিখুঁত নয় তবে তবুও এটি কাজটি করেছিল।

অস্বীকৃতি: আমি কোনওভাবেই টেলিগ্রিক বা প্লাগইন এর লেখক দ্বারা অনুমোদিত বা অনুমোদিত নই।


2
এই মূলত একই উত্তর এই এক হিসাবে , কুকিজ কি আছে এটি একটি অংশ মাত্র একটি শিরোনামের যে গত ছাড়াও। সেই উত্তরের সমস্ত সাবধানবাণী নোট করুন
জর্জ মাউয়ার

4

আমার জন্য সহজ সমাধানটি HTTPRequestMessage অবজেক্টে কুকি সেট করতে কাজ করে ।

protected async Task<HttpResponseMessage> SendRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken = default(CancellationToken))
{
    requestMessage.Headers.Add("Cookie", $"<Cookie Name 1>=<Cookie Value 1>;<Cookie Name 2>=<Cookie Value 2>");

    return await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);
}

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

@ জর্জিমৌর আপনার ঠিক থাকতে পারে দু'জনেই "এইচটিপিপিলেট (হ্যান্ডলার)" থেকে httpClient তৈরি করছেন। আমার ক্ষেত্রে আমি httpClientPool.GetOrCreateHttpClient ()
ওয়াকার উলহাক

1
তবে আপনি নিজের জবাবটিতে আসলে এটি প্রদর্শন করেন না বা পার্থক্য বা সুবিধাগুলি ব্যাখ্যা করেন না (এটিও আসলে প্রশ্ন নয়, তবে আমি সে সম্পর্কে উদ্বিগ্ন নই)। আমি অভদ্র হওয়ার চেষ্টা করছি না, এই উত্তরটি কার পক্ষে সহায়ক হবে তা পরিষ্কার হওয়া সবচেয়ে গুরুত্বপূর্ণ এটি অন্যদের পক্ষে আরও ভালভাবে সহায়তা করা সম্ভব হবে না।
জর্জ মাউয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.