2015-05-03 5 views
1

. Моя программа C# Windows Forms должна разговаривать с серверами, которые содержат несколько заголовков Set-Cookie в ответах HTTP.HttpWebResponse mishandles значения нескольких заголовков Set-Cookie, то есть CookieContainer не хранит все предполагаемые файлы cookie.

.NET HttpWebResponse, кажется, объединяет содержимое нескольких заголовков Set-Cookie в одно значение, оставляя окончательное значение недействительным. Это приводит к тому, что отправленные файлы 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 «s (копируется из 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 Reflection на оригинале HttpWebRequest «s CookieContainer, чтобы получить все куки (https://stackoverflow.com/a/15991071) также показывает только cookie1 анализируется в объект и cookie2 игнорируется.

Есть ли способы получить несколько заголовков Set-Cookie, обработанных должным образом, не прибегая к (значительно) более низким или более сложным альтернативам HttpWebResponse?

+0

Привет, вы решили? Потому что меня интересует эта проблема. – czubehead

+0

Технически, нет. Я узнал, что проблема связана с сервером, а не с клиентом. Сервер был быстрым приложением C# WinForms, которое я написал для тестирования, и в этом я делал 'ctx.Response.Headers.Add (« Set-Cookie: .... »);' несколько раз. Сервер объединил их в один заголовок «Set-Cookie». Поскольку сервер был только для быстрого тестирования, ошибка в «HttpWebResponse» для меня не была большой проблемой в долгосрочной перспективе, но, к сожалению, проблема на самом деле не решена. – user1092719

ответ

0

Вы не указали какие-либо образцы кода, с которыми у вас проблемы. Однако у меня были аналогичные проблемы с методом 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 documentation CookieContainer есть конкретный метод, как CookieCutter и CookieParser класса. В общем, он отвергает все файлы cookie с неправильным форматом (не RFC2109/RFC2965).