.Net 4.5 में HttpClient के साथ प्रतिक्रिया से बाहर निकलने की कोशिश कर रहा संघर्ष


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 वापस करने वाले कॉल पर लौटे हुए कुकी का उपयोग करता हूं ताकि मुझे प्रत्येक JSON कॉल के लिए एक अलग प्राधिकरण कॉल न करना पड़े। यह कहना है, मेरे पास कॉल लॉग / होम / गेटडाटा है जो JSON देता है लेकिन केवल अधिकृत होने पर। क्लाइंट के अनुरोध पर, मैं कुकी जोड़ता हूं ताकि / होम / गेटडाटा जवाब देगा। अन्यथा यह "403" अनधिकृत कहेगा।
पीटर केल्नर

एक डिफ़ॉल्ट हेडर के रूप में प्राधिकरण हेडर सेट करना लगभग उतना ही प्रभावी और थोड़ा अधिक मानक है। क्लाइंट की ओर से सर्वर के लिए स्वतः हेडर सेट करने का कोई तरीका नहीं है।
डारेल मिलर

1
टिप डारेल के लिए धन्यवाद। क्या आपके पास ऐसे कोई उदाहरण हैं जो asp.net में दिख सकते हैं? मैं अपने मोनोटॉक और अब मेरे विंडोज़ स्टोर ऐप के लिए इससे जूझता रहा। अगर कोई आसान तरीका होता तो मैं खुश होता। यह एक दर्द है, विशेष रूप से async के साथ और अब विंडोज़ स्टोर ऐप्स पर प्रतीक्षा करें।
पीटर केल्नर

जवाबों:


170

कुकी को एक अनुरोध में जोड़ने के लिए, अनुरोध से पहले कुकी कंटेनर को आबाद करें CookieContainer.Add(uri, cookie)। अनुरोध किए जाने के बाद कुकी कंटेनर स्वचालित रूप से प्रतिक्रिया से सभी कुकीज़ के साथ आबाद हो जाएगा। फिर आप उन्हें वापस लेने के लिए GetCookies () को कॉल कर सकते हैं।

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 का उपयोग करके" जोड़ना होगा;
काबुक्सा। मपाचे

^ ^ System.Linq केवल तभी आवश्यक है जब आप .Cast <> विधि का उपयोग करना चाहते हैं, यह कुकी पुनर्प्राप्ति के लिए आवश्यक नहीं है, लेकिन यह स्वयं व्याख्यात्मक होना चाहिए :)
माइकडब

क्या यह उसी तरह कुकीज़ प्राप्त करना संभव है, अगर httpclienthttpclient कारखाने से बनाया गया है? यानी बिल्डर विधि सेवाओं में जोड़ा गया। अतिरिक्तहॉटक्लाइंट
user3279954

Async पर हमने पहले से ही "google.com" का एक संदर्भ दिया है, हमें फिर से एक संदर्भ के साथ URI घोषित करने की आवश्यकता क्यों है?
मैल्कम साल्वाडोर

7

यदि आपके पास पहुँच नहीं है HttpClientऔर आप इंजेक्शन नहीं लगा सकते तो वैकल्पिक है CookieContainer। यह .NET Core 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

आप दिए गए URL से आसानी से कुकी मान प्राप्त कर सकते हैं।

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;
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.