2012-11-10 16 views
70

में HttpClient के साथ प्रतिक्रिया से बाहर कुकी प्राप्त करने की कोशिश कर रहा है मुझे निम्नलिखित कोड मिल गया है जो सफलतापूर्वक काम करता है। मैं समझ नहीं पा रहा हूं कि कुकी को प्रतिक्रिया से कैसे प्राप्त किया जाए। मेरा लक्ष्य यह है कि मैं अनुरोध में कुकीज़ सेट करने और प्रतिक्रिया से कुकीज़ प्राप्त करने में सक्षम होना चाहता हूं। विचार?.NET 4.5

  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; 
      } 
+0

जिज्ञासा से, क्या मैं पूछ सकता हूं कि आप क्लाइंट पर कुकीज़ क्यों पढ़ना चाहते हैं? मेरी समझ यह है कि कुकीज़ को सर्वर पर जानकारी भेजने के लिए उपयोग किया जाता है, सूचना वापस करने के लिए नहीं। –

+0

मैं जेएसओएन लौटने वाली कॉल पर लौटाई कुकी का उपयोग करता हूं ताकि मुझे प्रत्येक JSON कॉल के लिए एक अलग प्राधिकरण कॉल करने की आवश्यकता न हो। यही कहना है, मेरे पास कॉल लॉग/होम/गेटडाटा है जो JSON लौटाता है लेकिन केवल अधिकृत होने पर ही। ग्राहक अनुरोध पर, मैं कुकी जोड़ता हूं ताकि/home/GetData जवाब दे। अन्यथा यह "403" अनधिकृत कहेंगे। –

+0

प्राधिकरण शीर्षलेख को डिफ़ॉल्ट शीर्षलेख के रूप में सेट करना लगभग प्रभावी और थोड़ा अधिक मानक है। क्लाइंट की तरफ से स्वचालित रूप से ऑथ हेडर सेट करने के लिए सर्वर का कोई तरीका नहीं है। टिप डैरल के लिए –

उत्तर

127

CookieContainer.Add(uri, cookie) साथ अनुरोध से पहले एक अनुरोध करने के लिए कुकीज़ को जोड़ने के लिए, कुकी कंटेनर पॉप्युलेट:

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(); 
     } 
    } 

यहाँ पूरा जवाब है। अनुरोध किए जाने के बाद कुकी कंटेनर स्वचालित रूप से प्रतिक्रिया से सभी कुकीज़ के साथ पॉप्युलेट हो जाएगा। फिर आप उन्हें पुनर्प्राप्त करने के लिए 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(); 
+2

नोट: पहली कॉल में आरंभिक कुकीज़ प्राप्त करने के बाद, उसी डोमेन से किसी भी पृष्ठ तक पहुंचने पर, कुकीज़ स्वचालित रूप से भेजी जाएंगी, कोई अतिरिक्त कदम आवश्यक नहीं है। – Jahmic

संबंधित मुद्दे