Получение определенного файла cookie из ответа HttpRequestMessage

#c# #httpclient

#c# #httpclient

Вопрос:

Может кто-нибудь мне помочь, я хочу получить конкретное значение cookie из ответа HttpRequestMessage

Вот мой код:

 public static async Task<IEnumerable<string>> Login(string api, string info, CancellationToken ct = default)
        {
            Uri uri = new Uri(api, UriKind.Absolute);

            using (var request = new HttpRequestMessage(HttpMethod.Post, uri))
            {
                Account account = new Account("email", username, password);
               var options = new JsonSerializerOptions { WriteIndented = true };
              var info = JsonSerializer.Serialize(account, options);

                using (HttpContent content = new StringContent(info, Encoding.UTF8, "application/json"))
                {
                    content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");
                    request.Content = content;

                    var option = HttpCompletionOption.ResponseHeadersRead;
                    using (HttpResponseMessage response = await clientWithCookie.SendAsync(request, option).ConfigureAwait(false))
                    {
                        IEnumerable<string> rawCookies = response.Headers.GetValues("Set-Cookie");
                        return rawCookies;
                    }
                }
            }
        }
  

И это файлы cookie из ответа.

 set-cookie: .GNSAUTH=309B9571FE269F000C96C9CDA2812A56FFD7575B4E0D8512BD67ED2E9FBD41EC0A1139A58977F6113260D3B0A0A4BBB80613AE030CA1E79E0D2BD9CC1582FB8C292FB9105BA333C0F68CD3C54D316DD1BAC631852CE7A5918FE4D2ECF7B6B4CDDE4177C3CC446C93251D60D5BBF80103D293D2BE1A104B4866B278B9EB85E0B67C5180617E0D2E11DEDBE2F3C562704D878FEFDD33D261E2B6B866B2C82E2BED9FA8B4327685C84B8555C59EB9DA70264FBD4D88; expires=Fri, 23-Oct-2020 09:12:10 GMT; path=/; secure; HttpOnly; SameSite=lax
set-cookie: uid=0d63b942-4d58-40f5-afbd-fe5fa2dfe23b; expires=Fri, 23-Oct-2020 09:12:10 GMT; path=/; secure; SameSite=lax
set-cookie: returnUrl=; expires=Tue, 22-Sep-2020 09:12:10 GMT; path=/; secure; HttpOnly; SameSite=lax
set-cookie: AKA_A2=A; expires=Wed, 23-Sep-2020 10:12:10 GMT; path=/; domain=tv; secure; HttpOnly
  

Моя проблема в том, что я могу получить только последнее значение установленного файла cookie, которое равно AKA_A2= A; истекает = Ср, 23 сентября 2020 г. 10:12:10 по Гринвичу; path =/; domain= tv; secure; HttpOnly

Как я могу получить только первый файл cookie из .GNSAUTH=?

Ответ №1:

Вам нужно будет использовать CookieContainer. Создайте новый CookieContainer; Создайте новый HttpClientHandler, который может принимать файлы cookie, и установите для него CookieContainer. При создании экземпляра HttpClient установите для него этот HttpClientHandler.

После выполнения запроса вы можете проверить файлы cookie в контейнере cookie.

Вы можете попробовать это:

    var container = new CookieContainer();
   HttpClientHandler handler = new HttpClientHandler { UseCookies = true, CookieContainer= container };
   handler.CookieContainer = new System.Net.CookieContainer();
   clientWithCookie = new HttpClient(handler);
  

После успешного выполнения запроса:

     CookieCollection collection = handler.CookieContainer.GetCookies(new Uri("https://your.base.url"));
    foreach (Cookie item in result)
    {
        Console.WriteLine(item.Name);
        Console.WriteLine(item.Value);
        Console.WriteLine();
     }

  

Комментарии:

1. Привет, Самир. Я уже закончил настройку контейнера и клиента. Но как я могу сделать foreach для ответного сообщения?

2. Я не могу установить CookieCollection collection = container . getCookies(uri) в httpresponsemessage. Потому что я использую Sendasync

3. Небольшая поправка выше. Поскольку ожидается вызов, это должно сработать. Получите доступ к контейнеру файлов cookie в hander во время чтения файлов cookie и передайте базовый URL-адрес вашего API при получении файлов cookie.