DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

Cookieを使ってファイルをダウンロードし表示する

HttpWebRequestとHttpWebResponseクラスによりHTTPサーバーからファイルをダウンロードするときにクッキーを使用するには、HttpWebRequestクラスのCookieContainerプロパティに適当なCookieContainerオブジェクトを設定しておく必要があります。クッキーの送信にはCookieContainerプロパティのCookieContainerオブジェクトに格納されているCookieオブジェクトが使用され、受信したクッキーはHttpWebResponseクラスのCookiesプロパティにより取得できます。なお、Cookiesプロパティでは最後の応答で受信したクッキーしか取得できませんが、HttpWebRequest.CookieContainerプロパティには受信したすべてのクッキーが格納されます。

次に示すコンソールアプリケーションのサンプルは、Amazon.co.jpのトップページをクッキーを使って受信しています。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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フィールドをそのまま設定しても結果は同じではないかと思います。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。