HttpWebResponse неправильно обрабатывает значения нескольких заголовков Set-Cookie, то есть CookieContainer не хранит все предполагаемые файлы cookie
Моя программа C# Windows Forms должна общаться с серверами, которые включают несколько Set-Cookie
Заголовки в HTTP-ответах.
.NET-х HttpWebResponse
кажется, объединить содержимое нескольких Set-Cookie
Заголовки в одно значение - оставляя окончательное значение недействительным. Это приводит к тому, что отправленные куки не сохраняются должным образом при использовании связанных CookieContainer
,
пример
HttpWebRequest
инициирует запрос и сервер отвечает...
HTTP/1.1 200 OK
....
Set-Cookie: cookie1=123; Domain=127.0.0.1; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT
Set-Cookie: cookie2=456; Domain=127.0.0.1; Path=/somepath; Expires=Wed, 13 Jan 2021 22:23:01 GMT
....
...а также HttpWebResponse
Значение заголовка (скопировано из VS Debugger):
Set-Cookie: cookie1=123; Domain=127.0.0.1; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT,cookie2=456; Domain=127.0.0.1; Path=/somepath; Expires=Wed, 13 Jan 2021 22:23:01 GMT
HttpWebResponse
только содержит cookie1
в Cookies
имущество.
.NET Отражение на оригинале HttpWebRequest
"s CookieContainer
чтобы получить все куки ( /questions/23944393/kak-ya-mogu-poluchit-vse-cookies-ot-cookiecontainer/23944402#23944402) также показывает только cookie1
разбирается в объект и cookie2
игнорируется
Есть ли способы получить несколько Set-Cookie
заголовки обрабатываются правильно, не прибегая к (значительно) более низким уровням или более сложным альтернативам HttpWebResponse
?
1 ответ
Вы не указали примеры кода, с которыми у вас проблемы. Однако у меня были похожие проблемы с методом CookieContainer.SetCookies(). Когда я попытался установить хороший CookieHeader:
u=21seag24.ctcggq.f54cfsvgqp; v=1466603692; auth=1; dfp_group=15
CookieContainer впитал только 1-е печенье и все. Но они мне нужны все!
Чтобы справиться с этой проблемой, я добавил дополнительный метод:
public void FillCookieContainer(string cookieString, string url)
{
foreach (var cookieElement in cookieString.Split(';'))
{
CookieContainer.SetCookies(new Uri(url), cookieElement.Trim());
}
}
Ссылаясь на документацию Microsoft, CookieContainer имеет специальный метод, такой как CookieCutter и класс CookieParser. Как правило, он отклоняет все файлы cookie с неверным форматом (не RFC2109/RFC2965).