2012-11-10 25 views
70

Tôi có mã sau hoạt động thành công. Tôi không thể tìm ra cách để lấy cookie ra khỏi phản hồi. Mục tiêu của tôi là tôi muốn có thể đặt cookie trong yêu cầu và lấy cookie ra khỏi phản hồi. Suy nghĩ?Đấu tranh cố gắng lấy cookie ra khỏi phản hồi với HttpClient trong .net 4.5

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

Dưới đây là câu trả lời hoàn chỉnh:

  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

Ngoài sự tò mò, tôi có thể hỏi tại sao bạn muốn đọc cookie trên máy khách không? Sự hiểu biết của tôi là các cookie được sử dụng để gửi thông tin đến máy chủ, không phải để trả lại thông tin. –

+0

Tôi sử dụng cookie được trả về trên các cuộc gọi trả về JSON để tôi không phải thực hiện cuộc gọi ủy quyền riêng cho từng cuộc gọi JSON. Đó là để nói, tôi có một nhật ký cuộc gọi/Home/GetData trả về JSON nhưng chỉ khi được ủy quyền. Theo yêu cầu của khách hàng, tôi thêm cookie để/Home/GetData sẽ trả lời. Nếu không, nó sẽ nói "403" trái phép. –

+0

Đặt tiêu đề ủy quyền làm tiêu đề mặc định gần như hiệu quả và tiêu chuẩn hơn một chút. Không có cách nào để máy chủ tự động đặt tiêu đề auth thay mặt cho máy khách. –

Trả lời

127

Để thêm cookie để một yêu cầu, cư container Cookie trước khi yêu cầu với CookieContainer.Add(uri, cookie). Sau khi yêu cầu được thực hiện, vùng chứa cookie sẽ tự động được điền với tất cả cookie từ phản hồi. Sau đó, bạn có thể gọi cho GetCookies() để truy xuất chúng.

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

Lưu ý: Sau khi nhận được cookie ban đầu trong cuộc gọi đầu tiên, khi truy cập bất kỳ trang nào từ cùng một tên miền, cookie sẽ được gửi tự động, không cần thêm các bước bổ sung. – Jahmic

Các vấn đề liên quan