HttpClient не хранит файлы cookie в CookieContainer
Я использую VS2010
+ .NET 4.0
+ System.Net.Http
(от Nuget
).
По какой-то причине, которую мне не удается понять, cookie сеанса, который я получаю в моем HttpResponseMessage
, не сохраняется автоматически в HttpClient CookieContainer
.
Вот как выглядит мой код:
CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
HttpClient client = new HttpClient(handler);
Uri site = new Uri("https://www.mywebsite.com");
var response1 = client.SendAsync(new HttpRequestMessage(HttpMethod.Get,site)).Result;
В заголовках ответов я вижу, что у меня есть следующее:
Set-Cookie: JSESSIONID=FC8110E434C2C6DAB78B4E335024A639; Path=/member; Secure
Однако мой контейнер cookie остается пустым... почему?
Ответы
Ответ 1
Я думаю, проблема в том, что ваши файлы cookie безопасны. Проблема в том, что CookieContainer не будет отправлять безопасные файлы cookie обратно на сервер в последующих HTTP-запросах. Это может быть ошибка, или, возможно, у нее есть некоторые причины.
Обходной путь заключается в том, чтобы вручную добавить cookie в CookieContainer. Таким образом, cookie будет отправлен обратно в заголовке HTTP-запроса, поскольку при отправке файлов cookie на сервер не будет определено никакой безопасности.
Подробнее см. в этой статье.
Ответ 2
Используйте этот кусок кода для извлечения файлов cookie из ответа:
/// <summary>
/// Read web cookies
/// </summary>
public static CookieContainer ReadCookies(this HttpResponseMessage response)
{
var pageUri = response.RequestMessage.RequestUri;
var cookieContainer = new CookieContainer();
IEnumerable<string> cookies;
if (response.Headers.TryGetValues("set-cookie", out cookies))
{
foreach (var c in cookies)
{
cookieContainer.SetCookies(pageUri, c);
}
}
return cookieContainer;
}