নেট .৪.৪ এ এইচটিপিপিপ্লায়েন্টের সাথে কুকি প্রতিক্রিয়া ছাড়ার চেষ্টা করছে স্ট্রাগলিং


107

আমি নিম্নলিখিত কোড পেয়েছি যা সফলভাবে কাজ করে। কুকিটি কীভাবে সাড়া ফেলবে তা আমি বুঝতে পারি না। আমার লক্ষ্যটি হ'ল আমি অনুরোধে কুকি সেট করতে সক্ষম হতে এবং প্রতিক্রিয়া থেকে কুকিগুলি আউট করতে চাই। থটস?

private async Task<string> Login(string username, string password)
{
    try
    {
        string url = "http://app.agelessemail.com/account/login/";
        Uri address = new Uri(url);
        var postData = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("username", username),
            new KeyValuePair<string, string>("password ", password)
        };

        HttpContent content = new FormUrlEncodedContent(postData);
        var cookieJar = new CookieContainer();
        var handler = new HttpClientHandler
        {
            CookieContainer = cookieJar,
            UseCookies = true,
            UseDefaultCredentials = false
        };

        var client = new HttpClient(handler)
        {
            BaseAddress = address
        };


        HttpResponseMessage response = await client.PostAsync(url,content);
        response.EnsureSuccessStatusCode();
        string body = await response.Content.ReadAsStringAsync();
        return body;
    }
    catch (Exception e)
    {
        return e.ToString();
    }
}

এখানে সম্পূর্ণ উত্তর:

HttpResponseMessage response = await client.PostAsync(url,content);
response.EnsureSuccessStatusCode();

Uri uri = new Uri(UrlBase);
var responseCookies = cookieJar.GetCookies(uri);
foreach (Cookie cookie in responseCookies)
{
    string cookieName = cookie.Name;
    string cookieValue = cookie.Value;
}

কৌতূহলের বাইরে, আমি জিজ্ঞাসা করতে পারি যে আপনি ক্লায়েন্টে কুকি কেন পড়তে চান? আমার বোধগম্যতা হল যে কুকিজ সার্ভারে তথ্য প্রেরণের জন্য ব্যবহৃত হয়, তথ্য ফেরত দেওয়ার জন্য নয়।
ড্যারেল মিলার

আমি JSON ফেরত কলগুলিতে ফিরে আসা কুকিটি ব্যবহার করি যাতে প্রতিটি জেএসএন কলের জন্য আমাকে আলাদা অনুমোদন কল করতে না হয়। এটি বলার জন্য, আমার কাছে একটি কল লগ / হোম / গেটডেটা রয়েছে যা জেএসএনকে ফেরত দেয় তবে কেবল অনুমোদিত হলে। ক্লায়েন্টের অনুরোধে, আমি কুকি যুক্ত করি যাতে / হোম / গেটডেটা প্রতিক্রিয়া জানায়। অন্যথায় এটি অননুমোদিত "403" বলবে।
পিটার কেলনার

ডিফল্ট শিরোলেখ হিসাবে অনুমোদন শিরোনাম সেট করা প্রায় হিসাবে কার্যকর এবং কিছুটা বেশি মানক। সার্ভারের ক্লায়েন্টের পক্ষে স্বয়ংক্রিয়ভাবে লেখক শিরোনাম সেট করার কোনও উপায় নেই।
ড্যারেল মিলার

1
টিপ ড্যারেল জন্য ধন্যবাদ। এএসপনেটে দেখতে দেখতে এমন কোনও উদাহরণ রয়েছে কি? আমি আমার মনোোটুচ এবং এখন আমার উইন্ডোজ স্টোর অ্যাপ্লিকেশনটির জন্য এটির সাথে লড়াই করেছি। যদি কোনও সহজ উপায় থাকে তবে আমি খুশি হব। এটি একটি ব্যথা, বিশেষত async সহ এবং উইন্ডোজ স্টোর অ্যাপ্লিকেশনগুলিতে এখন অপেক্ষা করুন।
পিটার ক্যালনার

উত্তর:


170

কোনও অনুরোধে কুকি যোগ করতে, অনুরোধের আগে কুকি ধারককে آباد করুন CookieContainer.Add(uri, cookie)। অনুরোধটি তৈরি করার পরে কুকি ধারকটি স্বয়ংক্রিয়ভাবে প্রতিক্রিয়া থেকে সমস্ত কুকি দিয়ে পপুলেটে যাবে। তারপরে আপনি তাদের পুনরুদ্ধার করতে গেটকুকিজ () কল করতে পারেন।

CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;

HttpClient client = new HttpClient(handler);
HttpResponseMessage response = client.GetAsync("http://google.com").Result;

Uri uri = new Uri("http://google.com");
IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
foreach (Cookie cookie in responseCookies)
    Console.WriteLine(cookie.Name + ": " + cookie.Value);

Console.ReadLine();

8
দ্রষ্টব্য: প্রথম কলটিতে প্রাথমিক কুকিজ পাওয়ার পরে, একই ডোমেন থেকে কোনও পৃষ্ঠা অ্যাক্সেস করার সময়, কুকিজ স্বয়ংক্রিয়ভাবে প্রেরণ করা হবে, কোনও অতিরিক্ত পদক্ষেপের প্রয়োজন নেই।
জহমিক

আপনাকে অবশ্যই "System.linq ব্যবহার করে" যুক্ত করতে হবে;
ক্যাবুকসা.ম্যাপছে

। সিস্টেম.লিংক কেবল তখনই প্রয়োজন হয় যদি আপনি .Cast <> পদ্ধতিটি ব্যবহার করতে চান তবে কুকি পুনরুদ্ধারের জন্য এটি প্রয়োজন হয় না, তবে এটি স্ব
বর্ণনামূলক

যদি httpclienthttpclient কারখানা থেকে তৈরি করা হয় তবে কুকিজ একইভাবে পাওয়া সম্ভব ? অর্থাত্ বিল্ডার পদ্ধতিটি পরিষেবাগুলিতে যুক্ত হয়েছে
Hএইচটিএটিচটিপি ক্লায়েন্ট

অ্যাসিঙ্ক পাওয়ার পরে আমরা ইতিমধ্যে "google.com" এ একটি রেফারেন্স তৈরি করেছি, কেন এর আবারও একটি রেফারেন্স সহ আমাদের ইউআরআই ঘোষণার প্রয়োজন হবে?
ম্যালকম সালভাদোর

7

বিকল্পটি রয়েছে যদি আপনার অ্যাক্সেস না থাকে HttpClientএবং ইঞ্জেকশন না দিতে পারে CookieContainer। এটি নেট কোর 2.2 তে কাজ করে:

private string GetCookie(HttpResponseMessage message)
{
    message.Headers.TryGetValues("Set-Cookie", out var setCookie);
    var setCookieString = setCookie.Single();
    var cookieTokens = setCookieString.Split(';');
    var firstCookie = cookieTokens.FirstOrDefault();
    var keyValueTokens = firstCookie.Split('=');
    var valueString = keyValueTokens[1];
    var cookieValue = HttpUtility.UrlDecode(valueString);
    return cookieValue;
}

1
উজ্জ্বল এবং কাঁচা তবে ঠিক আমার যা দরকার ... ভাল কাজ, ধন্যবাদ।
বেদরান মান্ডিć

5

আপনি প্রদত্ত ইউআরএল দিয়ে খুব সহজেই একটি কুকির মান পেতে পারেন।

private async Task<string> GetCookieValue(string url, string cookieName)
{
    var cookieContainer = new CookieContainer();
    var uri = new Uri(url);
    using (var httpClientHandler = new HttpClientHandler
    {
        CookieContainer = cookieContainer
    })
    {
        using (var httpClient = new HttpClient(httpClientHandler))
        {
            await httpClient.GetAsync(uri);
            var cookie = cookieContainer.GetCookies(uri).Cast<Cookie>().FirstOrDefault(x => x.Name == cookieName);
            return cookie?.Value;
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.