Как проанализировать HttpWebResponse.Headers.Keys для идентификатора сеанса Set-Cookie - PullRequest
24 голосов
/ 29 июня 2009

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

Ответы [ 4 ]

56 голосов
/ 29 июня 2009

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

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

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

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

7 голосов
/ 25 декабря 2009

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

Просто хочу опубликовать мое использование - надеюсь, это поможет кому-нибудь в какой-то момент времени. Мое требование заключается в том, что мне нужно отправлять файлы 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;
5 голосов
/ 12 мая 2010

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

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

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

удачи Elia

1 голос
/ 18 января 2010

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

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

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

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

...