基本的な Web クロールを含むプロジェクトに取り組んでいます。私は HttpWebRequest と HttpWebResponse をうまく使ってきました。Cookie の処理については、毎回 HttpWebRequest.CookieContainer に割り当てる CookieContainer が 1 つだけあります。毎回新しい Cookie が自動的に取り込まれ、追加の処理は必要ありません。これは、以前は機能していた Web サイトの 1 つが突然機能しなくなった少し前まで、すべて正常に機能していました。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)));
これは、2 つの Cookie を設定する 2 つのページにアクセスすることをシミュレートします。次に、これらの Cookie のどれが 3 つのページのそれぞれに設定されるかを確認します。
2 つの Cookie のうち、1 つはパスを指定せずに設定され、もう 1 つはパスが指定されています。パスが指定されていない場合、Cookie はそのドメイン内の任意のページに送り返されると想定していましたが、その特定のページにのみ送り返されるようです。一貫性があるので、それは正しいと思います。
私にとっての主な問題は、パスが指定された Cookie の処理です。確かに、パスが指定されている場合、Cookie はそのパスに含まれるすべてのページに送信されます。したがって、上記のコードでは、「CookieWithPath」は、page1.html、page2.html、および page3.html を含む /some/path/ 内のすべてのページに対して有効である必要があります。確かに、2 つの「NoPathCookie」インスタンスをコメント アウトすると、予想どおり、「CookieWithPath」が 3 つのページすべてに送信されます。ただし、上記のように「NoPathCookie」を含めると、「CookieWithPath」は page2.html と page3.html にのみ送信され、page1.html には送信されません。
これはなぜですか、それは正しいですか?
この問題を検索すると、CookieContainer でのドメイン処理に関する問題についての議論に出くわしましたが、パス処理に関する議論は見つかりませんでした。
Visual Studio 2005 / .NET 2.0 を使用しています