#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.