Je travaille sur un projet qui implique une exploration de base du Web. J'ai utilisé HttpWebRequest et HttpWebResponse assez bien. Pour la gestion des cookies, j'ai juste un CookieContainer que j'affecte à HttpWebRequest.CookieContainer à chaque fois. Je reçois automatiquement les nouveaux cookies à chaque fois et ne nécessite aucun traitement supplémentaire de ma part. Tout cela a bien fonctionné jusqu'à tout récemment, lorsque l'un des sites Web qui fonctionnait soudainement a cessé de fonctionner. Je suis raisonnablement sûr que c'est un problème avec les cookies, mais je n'ai pas gardé un enregistrement des cookies de quand il a l'habitude de travailler, donc je ne suis pas sûr à 100%.CookieContainer gestion des chemins (Qui a mangé mon cookie?)
J'ai réussi à simuler le problème que je vois avec le code suivant:
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)));
Ceci simule la visite de deux pages, les deux qui définissent deux cookies. Il vérifie ensuite lequel de ces cookies sera défini sur chacune des trois pages.
Parmi les deux cookies, un est défini sans spécifier de chemin et l'autre a un chemin spécifié. Quand un chemin n'est pas spécifié, j'ai supposé que le cookie serait renvoyé vers n'importe quelle page de ce domaine, mais il semble que je ne sois renvoyé qu'à cette page spécifique. Je suppose maintenant que c'est correct car c'est cohérent.
Le principal problème pour moi est le traitement des cookies avec un chemin spécifié. Sûrement, si un chemin est spécifié alors le cookie devrait être envoyé à n'importe quelle page contenue dans ce chemin. Ainsi, dans le code ci-dessus, 'CookieWithPath' devrait être valide pour n'importe quelle page dans/some/path /, qui comprend page1.html, page2.html et page3.html. Certainement, si vous commentez les deux instances 'NoPathCookie', alors le 'CookieWithPath' est envoyé aux trois pages comme je l'aurais attendu. Cependant, avec l'inclusion de 'NoPathCookie' comme ci-dessus, alors 'CookieWithPath' n'est envoyé qu'aux pages2.html et page3.html, mais pas page1.html.
Pourquoi est-ce, et est-ce correct?
Recherche de ce problème J'ai rencontré une discussion sur un problème de gestion de domaine dans CookieContainer, mais je n'ai trouvé aucune discussion sur la gestion des chemins.
J'utilise Visual Studio 2005/2.0
.NET