HttpWebRequestとHttpWebResponseクラスによりHTTPサーバーからファイルをダウンロードするときにクッキーを使用するには、HttpWebRequestクラスのCookieContainerプロパティに適当なCookieContainerオブジェクトを設定しておく必要があります。クッキーの送信にはCookieContainerプロパティのCookieContainerオブジェクトに格納されているCookieオブジェクトが使用され、受信したクッキーはHttpWebResponseクラスのCookiesプロパティにより取得できます。なお、Cookiesプロパティでは最後の応答で受信したクッキーしか取得できませんが、HttpWebRequest.CookieContainerプロパティには受信したすべてのクッキーが格納されます。
次に示すコンソールアプリケーションのサンプルは、Amazon.co.jpのトップページをクッキーを使って受信しています。
Imports System Class MainClass 'エントリポイント Public Shared Sub Main() '指定したURLのHTMLを受信し、表示する Console.WriteLine(GetHtml("http://www.amazon.co.jp/")) 'もう一度受信する Console.WriteLine(GetHtml("http://www.amazon.co.jp/")) End Sub 'Cookieを保存しておくCookieContainer Private Shared cContainer As New System.Net.CookieContainer Private Shared Function GetHtml(ByVal url As String) As String '文字コードを指定する Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding("shift_jis") 'WebRequestの作成 Dim webreq As System.Net.HttpWebRequest = _ CType(System.Net.WebRequest.Create(url), _ System.Net.HttpWebRequest) 'CookieContainerプロパティを設定する webreq.CookieContainer = New System.Net.CookieContainer '要求元のURIに関連したCookieを追加し、要求に使用する webreq.CookieContainer.Add( _ cContainer.GetCookies(webreq.RequestUri)) 'サーバーからの応答を受信するためのWebResponseを取得 Dim webres As System.Net.HttpWebResponse = _ CType(webreq.GetResponse(), System.Net.HttpWebResponse) '受信したCookieのコレクションを取得する Dim cookies As System.Net.CookieCollection = _ webreq.CookieContainer.GetCookies(webreq.RequestUri) 'Cookie名と値を列挙する Dim cook As System.Net.Cookie For Each cook In cookies Console.WriteLine("{0}={1}", cook.Name, cook.Value) Next cook '取得したCookieを保存しておく cContainer.Add(cookies) '応答データを受信するためのStreamを取得 Dim st As System.IO.Stream = webres.GetResponseStream() Dim sr As New System.IO.StreamReader(st, enc) '受信して表示 Dim html As String = sr.ReadToEnd() '閉じる sr.Close() Return html End Function End Class
using System; class MainClass { //エントリポイント public static void Main() { //指定したURLのHTMLを受信し、表示する Console.WriteLine(GetHtml("http://www.amazon.co.jp/")); //もう一度受信する Console.WriteLine(GetHtml("http://www.amazon.co.jp/")); } //Cookieを保存しておくCookieContainer private static System.Net.CookieContainer cContainer = new System.Net.CookieContainer(); private static string GetHtml(string url) { //文字コードを指定する System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //WebRequestの作成 System.Net.HttpWebRequest webreq = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url); //CookieContainerプロパティを設定する webreq.CookieContainer = new System.Net.CookieContainer(); //要求元のURIに関連したCookieを追加し、要求に使用する webreq.CookieContainer.Add(cContainer.GetCookies(webreq.RequestUri)); //サーバーからの応答を受信するためのWebResponseを取得 System.Net.HttpWebResponse webres = (System.Net.HttpWebResponse) webreq.GetResponse(); //受信したCookieのコレクションを取得する System.Net.CookieCollection cookies = webreq.CookieContainer.GetCookies(webreq.RequestUri); //Cookie名と値を列挙する foreach (System.Net.Cookie cook in cookies) Console.WriteLine("{0}={1}", cook.Name, cook.Value); //取得したCookieを保存しておく cContainer.Add(cookies); //応答データを受信するためのStreamを取得 System.IO.Stream st = webres.GetResponseStream(); System.IO.StreamReader sr = new System.IO.StreamReader(st, enc); //受信して表示 string html = sr.ReadToEnd(); //閉じる sr.Close(); return html; } }
上記の例では受信するたびにCookieContainerプロパティに新しいCookieContainerクラスのインスタンスを設定し、CookieContainer.Addメソッドを呼び出していますが、cContainerフィールドをそのまま設定しても結果は同じではないかと思います。