Câu hỏi Đấu tranh cố gắng lấy cookie ra khỏi phản hồi với HttpClient trong .net 4.5


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ĩ?

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

Đâ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;
            }

76
2017-11-10 00:48


gốc


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. - Darrel Miller
Tôi sử dụng cookie được trả về trên các cuộc gọi trả lại 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. - Peter Kellner
Đặt tiêu đề cấp 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. - Darrel Miller
cảm ơn Darrel. Bạn có bất kỳ ví dụ về những gì có thể trông giống như trong asp.net? Tôi vật lộn với điều này cho monotouch của tôi và bây giờ cửa sổ ứng dụng cửa hàng của tôi. Tôi sẽ rất vui nếu có một cách đơn giản. Đây là một nỗi đau, đặc biệt là với async và đang chờ đợi trên cửa sổ ứng dụng lưu trữ. - Peter Kellner


Các câu trả lời:


Để thêm cookie vào yêu cầu, hãy điền vào vùng chứa cookie trước khi yêu cầu 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();

133
2017-11-10 01:05



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
Bạn phải thêm "using System.linq;" - Cabuxa.Mapache


Bạn có thể dễ dàng nhận được một giá trị cookie với URL đã cho.

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

0
2017-08-10 12:55