Как проанализировать HttpWebResponse.Headers.Keys для идентификатора сеанса Set-Cookie

Я пытаюсь создать сеанс HttpWebRequest / HttpWebResponse с веб-сайтом ASP.NET, чтобы позже проанализировать HTML-форму с помощью параметров URL (эту часть я знаю, как сделать), но я не понимаю, как анализировать и устанавливать cookie, такие как идентификатор сеанса В Fiddler он показывает, что идентификатор сеанса ASP.NET возвращается через Set-Cookie в ответ на запрос к / пути URL, но как я могу извлечь этот идентификатор сеанса и установить его в качестве файла cookie для следующего запроса HttpWebRequest? ? Я понимаю, что этот заголовок Set-Cookie будет найден в HttpWebResponse.Headers.Keys, но есть ли прямой путь к его разбору? Спасибо!

 Dan Herbert30 июн. 2009 г., 02:40
Добро пожаловать!

Ответы на вопрос(4)

гул, я могу ошибаться, но из того, что я наблюдаю в последнее время

Файлы cookie из первого ответа не включают в себя «набор файлов cookie»; в виде файлов cookie, которые появляются в заголовке (например, некоторый идентификатор сеанса ...) в случае статуса 302 (перенаправление)

Если для свойства autofollowredirect установлено значение true, то установленные файлы cookie обрабатываются, и последующий запрос, который выполняется автоматически, будет включать в себя те файлы cookie, которые определены установленным файлом cookie при первом вызове.

Если для autofollowredirect задано значение false, то в первом запросе cookie-файлы не позиционируются установленным cookie-файлом, и я полагаю, и это также мой квест, если кто-нибудь знает, что единственный способ впоследствии получить эти cookie-файлы в следующем запросе - это анализ установленные куки?

 23 авг. 2011 г., 18:02
У меня были проблемы с редиректом 302 и я установил AllowAutoRedirect = false. Это дало мне & quot; эту страницу переместили & quot; ответ, но затем я передаю файлы cookie и перенаправляю на страницу, на которую я хотел зайти в первую очередь.
 20 окт. 2011 г., 04:36
According to RFC 6265 Пользовательские агенты МОГУТ игнорировать заголовки Set-Cookie, содержащиеся в ответах с 100-уровневыми кодами состояния, но ДОЛЖНЫ обрабатывать заголовки Set-Cookie, содержащиеся в других ответах (включая ответы с кодами состояния 400 и 500).
Решение Вопроса

.NET Framework будет управлять файлами cookie для вас. Вам не нужно заботиться о том, чтобы анализировать информацию о файлах cookie из заголовков или добавлять заголовки файлов cookie к вашим запросам.

Чтобы сохранить и отправить свой идентификатор сессии, используйтеCookie а такжеCookieContainer классы для их хранения, а затем убедитесь, что вы отправляете свои куки с каждым запросом.

В следующем примере показано, как это сделать. CookieContainer, & apos;cookieJar& APOS; могут быть разделены между несколькими доменами и запросами. Как только вы добавите его к объекту запроса, ссылка на него также будет добавлена к объекту ответа при возврате ответа.

CookieContainer cookieJar = new CookieContainer();

var request = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com");
request.CookieContainer = cookieJar;

var response = request.GetResponse();

foreach (Cookie c in cookieJar.GetCookies(request.RequestUri))
{
    Console.WriteLine("Cookie['" + c.Name + "']: " + c.Value);
}

Выход этого кода будет:

Cookie['PREF']: ID=59e9a22a8cac2435:TM=1246226400:LM=1246226400:S=tvWTnbBhK4N7Tlpu

 29 сент. 2011 г., 11:45
+1 Спасибо за эту благодарную помощь! Я не ожидал ручного разбора заголовков HTTP :)
 01 июл. 2012 г., 05:53
Это неожиданное поведение ... response.Cookies не должны быть пустыми, если CookieContainer не определен.
 Maxim Zaslavsky30 июн. 2009 г., 00:25
Я реализовал это, и это работает! Огромное спасибо.
 01 июл. 2012 г., 15:05
@DaviFiamenghi Это, однако, документированное поведение. Microsoft ожидает, что у вас будет один объект управления файлами cookie для совместного использования через веб-запросы / ответы. Если вы этого не сделаете, вам нужно будет вручную проанализировать заголовки ответа для файлов cookie.
 Maxim Zaslavsky29 июн. 2009 г., 00:49
Огромное спасибо!!! Это действительно поможет мне !!! Ура! :)

Ответ от Дана Герберта мне очень помог. Я ценю вашу помощь.

Просто хочу опубликовать мое использование - надеюсь, что это поможет кому-то в какой-то момент. Мое требование заключается в том, что мне нужно отправлять файлы cookie с первого HTTP-ответа на второй HTTP-запрос.

первая:

CookieContainer cookieJar = new CookieContainer();
request.CookieContainer = cookieJar;
....

CookieCollection setCookies = cookieJar.GetCookies(request.RequestUri);

второй:

CookieContainer cc = new CookieContainer();
cc.Add(setCookies);    
request.CookieContainer = cc;

У меня такая же проблема (с амазонкой) Я использую следующее регулярное выражение:

string regexp = "(?<name>[^=]+)=(?<val>[^;]+)[^,]+,?";);
MatchCollection myMatchCollection = Regex.Matches(cookiesStr, regexp);
foreach (Match myMatch in myMatchCollection)
{
string cookieName = myMatch.Groups["name"].ToString();
string cookieVal = myMatch.Groups["val"].ToString();
Cookie cookie = new Cookie(cookieName, cookieVal);
cookies.Add(cookie);
}

Обратите внимание, что я забочусь только об имени / значении файла cookie ...

удачи Elia

 13 июн. 2012 г., 20:27
Это именно тот тип решения, которое я ищу (объект WebBrowser предоставляет только строку для файла cookie). Однако ваш код не компилируется.

Ваш ответ на вопрос