CookieContainer обработка путей (Кто съел мой cookie?)

Я работаю над проектом, который включает в себя базовое сканирование в Интернете. Я довольно успешно использую HttpWebRequest и HttpWebResponse. Для обработки файлов cookie у меня есть только один CookieContainer, который я каждый раз назначаю HttpWebRequest.CookieContainer. Я автоматически получаю новые файлы cookie каждый раз, и мне не требуется никакой дополнительной обработки. Все это работало нормально до недавнего времени, когда один из ранее работавших веб-сайтов внезапно перестал работать. Я вполне уверен в этом ' это проблема с файлами cookie, но я не вел записи о файлах cookie, когда они работали, поэтому я не уверен на 100%.

Мне удалось смоделировать проблему, как я вижу, с помощью следующего код:

CookieContainer cookieJar = new CookieContainer();

Uri uri1 = new Uri("http://www.somedomain.com/some/path/page1.html");
CookieCollection cookies1 = new CookieCollection();
cookies1.Add(new Cookie("NoPathCookie", "Page1Value"));
cookies1.Add(new Cookie("CookieWithPath", "Page1Value", "/some/path/"));

Uri uri2 = new Uri("http://www.somedomain.com/some/path/page2.html");
CookieCollection cookies2 = new CookieCollection();
cookies2.Add(new Cookie("NoPathCookie", "Page2Value"));
cookies2.Add(new Cookie("CookieWithPath", "Page2Value", "/some/path/"));

Uri uri3 = new Uri("http://www.somedomain.com/some/path/page3.html");

// Add the cookies from page1.html
cookieJar.Add(uri1, cookies1);

// Add the cookies from page2.html
cookieJar.Add(uri2, cookies2);

// We should now have 3 cookies
Console.WriteLine(string.Format("CookieJar contains {0} cookies", cookieJar.Count));

Console.WriteLine(string.Format("Cookies to send to page1.html: {0}", cookieJar.GetCookieHeader(uri1)));
Console.WriteLine(string.Format("Cookies to send to page2.html: {0}", cookieJar.GetCookieHeader(uri2)));
Console.WriteLine(string.Format("Cookies to send to page3.html: {0}", cookieJar.GetCookieHeader(uri3)));

Имитация посещения двух страниц, каждая из которых устанавливает два файла cookie. Затем он проверяет, какие из этих файлов cookie будут установлены для каждой из трех страниц.

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

Основная проблема для меня - это обработка файлов cookie с указанным путем. Конечно, если путь указан, то cookie должен быть отправлен на любую страницу, содержащуюся в этом пути. Так, в приведенном выше коде CookieWithPath должно быть действительным для любой страницы в / some / path /, включая page1.html, page2.html и page3.html. Конечно, если вы закомментируете два экземпляра «NoPathCookie», то «CookieWithPath» будет отправлен на все три страницы, как я и ожидал. Однако с включением «NoPathCookie», как указано выше, «CookieWithPath» отправляется только на page2.html и page3.html, но не на page1.html.

Почему это так и правильно ли?

Поиск по этой проблеме я столкнулся с обсуждением проблемы с обработкой домена в CookieContainer, но не смог найти никакого обсуждения обработки пути.

Я использую Visual Studio 2005 / .NET 2.0

9
задан Andy 15 September 2010 в 10:57
поделиться