ওয়েবক্লিনেন্ট শ্রেণীর সাথে কুকি কনটেনার ব্যবহার করা


148

আমি এর আগে এইচটিটিপিওব্রেইকয়েস্ট এবং এইচটিটিপিওয়েবরেসপনস সেশন সহ একটি কুকি কনটেনার ব্যবহার করেছি, তবে এখন, আমি এটি একটি ওয়েবক্লিয়েন্ট দিয়ে ব্যবহার করতে চাই। আমি যতদূর বুঝতে পেরেছি, এখানে কোনও অন্তর্নির্মিত পদ্ধতি নেই যেমন HTTPWebRequests ( request.CookieContainer) এর জন্য রয়েছে। আমি কীভাবে একটি কুকি কনটেইনার ওয়েবক্লিনেন্ট থেকে কুকিজ সংগ্রহ করতে পারি?

আমি এটির জন্য গুগল করেছি এবং নীচের নমুনাটি পেয়েছি :

public class CookieAwareWebClient : WebClient
{
    private readonly CookieContainer m_container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        HttpWebRequest webRequest = request as HttpWebRequest;
        if (webRequest != null)
        {
            webRequest.CookieContainer = m_container;
        }
        return request;
    }
}

এটি কি এটি সেরা উপায়?


1
আমার দৃষ্টিকোণ থেকে m_containerসেট করা হয় না !? সবসময় ফাঁকা থাকে না?
সি

আমি বিশ্বাস করি যে HTTPWebRequest শ্রেণি প্রয়োজন হিসাবে m_container শ্রেণীর অভ্যন্তরীণ ক্ষেত্র কুকি কনটেনার ব্যবহার করে পরিবর্তন করে if
হার্টওয়্যার

এই আপনার প্রয়োজন হয়! প্রতিক্রিয়াগুলি থেকে কুকিগুলি স্বয়ংক্রিয়ভাবে ধারকটিতে যুক্ত হবে।
লাইনিলো

উত্তর:


69

হ্যাঁ. আইএমএইচও, getWebRequest () কে ওভাররাইড করা ওয়েবক্লিয়েন্টের সীমাবদ্ধ কার্যকারিতার সর্বোত্তম সমাধান। এই বিকল্পটি সম্পর্কে জানার আগে, আমি HTTPWebRequest স্তরটিতে প্রচুর বেদনাদায়ক কোড লিখেছিলাম কারণ ওয়েবক্লিয়েন্ট প্রায় প্রয়োজন ছিল না, তবে আমার প্রয়োজন অনুসারে কাজ করেছিল। ডেরাইভেশন অনেক সহজ।

অন্য বিকল্পটি হ'ল নিয়মিত ওয়েবক্লিয়েন্ট শ্রেণি ব্যবহার করা, তবে অনুরোধ করার আগে কুকি শিরোনামটি ম্যানুয়ালি পপুলেট করুন এবং তারপরে প্রতিক্রিয়াতে সেট-কুকিজ শিরোনামটি টানুন। কুকি কনটেনার ক্লাসে সহায়তার পদ্ধতি রয়েছে যা এই শিরোনামগুলি তৈরি এবং পার্সিংকে আরও সহজ করে তোলে: CookieContainer.SetCookies()এবং CookieContainer.GetCookieHeader()যথাক্রমে।

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


118
 WebClient wb = new WebClient();
 wb.Headers.Add(HttpRequestHeader.Cookie, "somecookie");

মন্তব্য থেকে

"সামকুকি" এর জায়গায় আপনি কীভাবে কুকির নাম এবং মানটি ফর্ম্যাট করবেন?

wb.Headers.Add(HttpRequestHeader.Cookie, "cookiename=cookievalue"); 

একাধিক কুকিজের জন্য:

wb.Headers.Add(HttpRequestHeader.Cookie, 
              "cookiename1=cookievalue1;" +
              "cookiename2=cookievalue2");

"সামকুকি" এর জায়গায় আপনি কীভাবে কুকির নাম এবং মানটি ফর্ম্যাট করবেন?
নিল এন

11
@ নীল এন: ডাব্লু ডাব্লু.হাইডার্স.এড যোগ করুন (এইচটিপিআরকিউস্টেহাইডার.কুকি, "কুকিয়ানাম = কুকিভ্যালু"); একাধিক কুকিজের জন্য: wb.Heeda.Add (HttpRequestHeader.Cookie, "ڪوڪيিয়ানাম 1 = কুকিভ্যালু 1; কুকিয়ানাম 2 = কুকিভ্যালু 2");
ইয়ান কেম্প

46

এইটি আপনার পাওয়া নিবন্ধের কেবলমাত্র এক্সটেনশন।


public class WebClientEx : WebClient
{
    public WebClientEx(CookieContainer container)
    {
        this.container = container;
    }

    public CookieContainer CookieContainer
        {
            get { return container; }
            set { container= value; }
        }

    private CookieContainer container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest r = base.GetWebRequest(address);
        var request = r as HttpWebRequest;
        if (request != null)
        {
            request.CookieContainer = container;
        }
        return r;
    }

    protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
    {
        WebResponse response = base.GetWebResponse(request, result);
        ReadCookies(response);
        return response;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        ReadCookies(response);
        return response;
    }

    private void ReadCookies(WebResponse r)
    {
        var response = r as HttpWebResponse;
        if (response != null)
        {
            CookieCollection cookies = response.Cookies;
            container.Add(cookies);
        }
    }
}

3
এটি @ পাভেলটি ভালভাবে কাজ করেছে, যদিও আপনি ক্লাসের বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন, বিশেষত এটিতে কুকিগুলি সেট করে এবং পেয়ে কীভাবে এই উত্তরটি উন্নত করতে পারেন।
করগালোর

এক্সটেনশন জন্য Thx। এটির ব্যবহারের জন্য আমি সর্বজনীন কুকি কনটেনার কুকি কনটেনার যুক্ত করি {get {রিটার্ন _ কনটেনার; } set {_container = মান; }}
ইগোর শুবিন

1
@IgorShubin আপনি সরাতে আছে readonlyএর পরিবর্তক container, ক্ষেত্র অন্যথায় আপনি সম্পত্তি এটা সেট করতে পারিনি। আমি কোডটি সংশোধন করেছি।
হিলিন

1
আপনার কি Set-Cookieপ্রতিক্রিয়া শিরোনামটি পরীক্ষা করা উচিত নয় ReadCookies?
অ্যাকিলিস

2
আপনার আসলে দরকার নেই GetWebResponseএবং ReadCookiesকুকিজগুলি স্বয়ংক্রিয়ভাবে ধারকটিতে যুক্ত হবে।
লাইনিলো

15

এইচটিটিপিওয়েবরেউয়েস্ট এতে নির্ধারিত কুকি কন্টেইনারকে সংশোধন করে। ফেরত কুকিগুলি প্রক্রিয়া করার প্রয়োজন নেই। কেবলমাত্র প্রতিটি কুকি কনটেইনার প্রতিটি ওয়েব অনুরোধের জন্য বরাদ্দ করুন।

public class CookieAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; set; } = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri uri)
    {
        WebRequest request = base.GetWebRequest(uri);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = CookieContainer;
        }
        return request;
    }
}

6

আমি মনে করি পরিষ্কার উপায় আছে যেখানে আপনাকে নতুন ওয়েবক্লিয়েন্ট তৈরি করতে হবে না (এবং এটি তৃতীয় পক্ষের লাইব্রেরিগুলির সাথেও কাজ করবে)

internal static class MyWebRequestCreator
{
    private static IWebRequestCreate myCreator;

    public static IWebRequestCreate MyHttp
    {
        get
        {
            if (myCreator == null)
            {
                myCreator = new MyHttpRequestCreator();
            }
            return myCreator;
        }
    }

    private class MyHttpRequestCreator : IWebRequestCreate
    {
        public WebRequest Create(Uri uri)
        {
            var req = System.Net.WebRequest.CreateHttp(uri);
            req.CookieContainer = new CookieContainer();
            return req;
        }
    }
}

এখন আপনাকে যা করতে হবে তা হ'ল কোন ডোমেনগুলির জন্য আপনি এটি ব্যবহার করতে চান:

    WebRequest.RegisterPrefix("http://example.com/", MyWebRequestCreator.MyHttp);

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


আমি গত কয়েক দফা বাক্য সম্পর্কে নিশ্চিত নই; ডক্স বলে, "HttpWebRequest বর্গ ডিফল্টরূপে HTTP এবং HTTPS স্কিম জন্য সেবা অনুরোধ নিবন্ধিত এই স্কিম ব্যর্থ হবে জন্য একটি ভিন্ন WebRequest বংশধর রেজিস্টার প্রচেষ্টা করা হয়েছে।।"
হিরোহতার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.