Estoy trabajando en un proyecto que implica un rastreo web básico. He estado utilizando HttpWebRequest y HttpWebResponse con bastante éxito. Para el manejo de cookies, solo tengo un CookieContainer que asigno a HttpWebRequest.CookieContainer cada vez. Me vuelvo a llenar automáticamente con las nuevas cookies cada vez y no requiere un manejo adicional de mi parte. Todo esto ha funcionado bien hasta hace poco cuando uno de los sitios web que solía funcionar de repente dejó de funcionar. Estoy razonablemente seguro de que es un problema con las cookies, pero no guardé un registro de las cookies de cuando solía funcionar, así que no estoy 100% seguro.CookieContainer manejo de rutas (¿Quién comió mi cookie?)
He conseguido simular el problema tal como la veo con el siguiente código:
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)));
Esto simula visitar dos páginas, los cuales establecen dos galletas. A continuación, comprueba cuál de esas cookies se establecería en cada una de las tres páginas.
De las dos cookies, una se establece sin especificar una ruta y la otra tiene una ruta especificada. Cuando no se especifica una ruta, asumí que la cookie se enviaría de vuelta a cualquier página de ese dominio, pero parece que solo se envía de vuelta a esa página específica. Ahora estoy asumiendo que es correcto ya que es consistente.
El principal problema para mí es el manejo de cookies con una ruta especificada. Seguramente, si se especifica una ruta, la cookie debe enviarse a cualquier página contenida dentro de esa ruta. Por lo tanto, en el código anterior, 'CookieWithPath' debe ser válido para cualquier página dentro de/some/path /, que incluye page1.html, page2.html y page3.html. Ciertamente, si comenta las dos instancias 'NoPathCookie', entonces 'CookieWithPath' se envía a las tres páginas como era de esperar. Sin embargo, con la inclusión de 'NoPathCookie' como se indica anteriormente, 'CookieWithPath' solo se envía a page2.html y page3.html, pero no a page1.html.
¿Por qué es esto, y es correcto?
Buscando este problema He encontrado una discusión sobre un problema con el manejo de dominio en CookieContainer, pero no he podido encontrar ninguna discusión sobre el manejo de rutas.
Estoy usando Visual Studio 2005/.NET 2,0