HttpWebRequestを用いて Cookieの値をクライアント側で設定する - Cookieの値を偽装する - C#

クライアント側のアプリケーションでCookieの値を独自の値に設定するコードを紹介します。

概要

こちらの記事ではHttpWebRequestでCookieを用いてWebページやコンテンツを取得するコードを紹介しました。Cookieの値は一般的にはサーバー側で書きこまれ、書きこまれた情報は次回以降のアクセス時にサーバーで読み取り、各種処理に使われます。ここではクライアントアプリ側でCookieの値を独自の値に書き換えるコードを紹介します。(Cookieの値の偽装と同様の動作になります。)

UI

下図のUIを作成します。Buttonを4つ、TextBoxを1つ配置します。TextBoxはMultiLinesプロパティをtrueに設定します。またScrollBarsプロパティをBothに設定します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Web;

namespace ClientSetCookie
{
  public partial class FormMain : Form
  {
    private CookieContainer cc;

    public FormMain()
    {
      InitializeComponent();
    }

    private void FormMain_Load(object sender, EventArgs e)
    {
      cc = new CookieContainer();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.ipentec.com/webapp/CookieDemo/CookieView.aspx");
      req.Method = "GET";
      req.CookieContainer = cc;

      HttpWebResponse res = (HttpWebResponse)req.GetResponse();

      Stream s = res.GetResponseStream();
      StreamReader sr = new StreamReader(s);
      string content = sr.ReadToEnd();
      textBox1.Text = content;
    }

    private void button2_Click(object sender, EventArgs e)
    {
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.ipentec.com/webapp/CookieDemo/CookieWrite.aspx");
      req.Method = "GET";
      req.CookieContainer = cc;
      HttpWebResponse res = (HttpWebResponse)req.GetResponse();
      Stream s = res.GetResponseStream();
      StreamReader sr = new StreamReader(s);
      string content = sr.ReadToEnd();
      textBox1.Text = content;
    }

    private void button3_Click(object sender, EventArgs e)
    {
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.ipentec.com/webapp/CookieDemo/CookieClear.aspx");
      req.Method = "GET";
      req.CookieContainer = cc;

      HttpWebResponse res = (HttpWebResponse)req.GetResponse();

      Stream s = res.GetResponseStream();
      StreamReader sr = new StreamReader(s);
      string content = sr.ReadToEnd();
      textBox1.Text = content;
    }

    private void button4_Click(object sender, EventArgs e)
    {
      Cookie ck1 = new Cookie("name", HttpUtility.UrlEncode("ペンギン"));
      Cookie ck2 = new Cookie("value","840");
      Uri uri = new Uri("http://www.ipentec.com");

      cc.Add(uri, ck1);
      cc.Add(uri, ck2);
      
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.ipentec.com/webapp/CookieDemo/CookieView.aspx");
      req.Method = "GET";
      req.CookieContainer = cc;

      HttpWebResponse res = (HttpWebResponse)req.GetResponse();

      Stream s = res.GetResponseStream();
      StreamReader sr = new StreamReader(s);
      string content = sr.ReadToEnd();
      textBox1.Text = content;
    }
  }
}

解説

button1(Get CookieView), Button2(Get CookieWrite). button3(Get CookieClear)のコードについてはこちらの記事で解説していますので参照してください。
button4 (Get CookieView (Set Cookie))
private void button4_Click(object sender, EventArgs e)
{
  Cookie ck1 = new Cookie("name", HttpUtility.UrlEncode("ペンギン"));
  Cookie ck2 = new Cookie("value","840");
  Uri uri = new Uri("http://www.ipentec.com");

  cc.Add(uri, ck1);
  cc.Add(uri, ck2);
      
  HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.ipentec.com/webapp/CookieDemo/CookieView.aspx");
  req.Method = "GET";
  req.CookieContainer = cc;

  HttpWebResponse res = (HttpWebResponse)req.GetResponse();

  Stream s = res.GetResponseStream();
  StreamReader sr = new StreamReader(s);
  string content = sr.ReadToEnd();
  textBox1.Text = content;
}

  Cookie ck1 = new Cookie("name", HttpUtility.UrlEncode("ペンギン"));
  Cookie ck2 = new Cookie("value","840");
  Uri uri = new Uri("http://www.ipentec.com");
上記コードにより、Cookieのインスタンスを作成しCookieCollectionに追加します。Cookieは1つの項目に対して1つのオブジェクトを作成します。コンストラクタの第一引数に項目名、第二引数に値を与えます。こちらの記事でも紹介されていますが、Cookieの値に日本語の文字列を設定すると文字化けになる原因となるため、全角文字はURLエンコードしてCookieに保存しています。
上記のコードではCookieの"name"キーに"ペンギン"を"value"キーに"840"を設定しています。

  cc.Add(uri, ck1);
  cc.Add(uri, ck2);
値を設定したCookieのオブジェクトは、CookieCollectionのAddメソッドを呼び出してCookieをCookieCollectionに追加します。Addメソッドの第一引数はCookieの属するドメイン名を、第二引数にCookieオブジェクトを与えます。
第一引数のドメイン名はアクセス先のホストのドメインを指定します。

  HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.ipentec.com/webapp/CookieDemo/CookieView.aspx");
  req.Method = "GET";
  req.CookieContainer = cc;
HttpWebRequestのインスタンスを作成し、メソッドを設定します。CookieはHttpWebRequestのCookieContainerに送信するCookieのCookieContainerを設定します。

  HttpWebResponse res = (HttpWebResponse)req.GetResponse();

  Stream s = res.GetResponseStream();
  StreamReader sr = new StreamReader(s);
  string content = sr.ReadToEnd();
  textBox1.Text = content;
HttpWebRequestのGetResponse()メソッドを呼び出し、Webページを取得します。取得情報にはHttpWebResponseでアクセスできます。今回はテキストデータのため、StreamReaderを用いてレスポンスデータを取得し、テキストボックスに表示します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Get CookieView]ボタンをクリックします。HTMLページのテキストが表示されます。Cookieに値が設定されていないため、name, valueともに値は空になっています。


[Get CookieWrite]ボタンをクリックします。サーバー側でCookieの値が設定されます。Cookieが設定された旨のHTMLが返されます。


再度、[Get CookieView]ボタンをクリックします。Cookieに値が設定されているため、name, valueの欄に値が表示されています。


[Get CookieView (Set Cookie)]ボタンをクリックします。ローカルのアプリでCookieの内容を書き換え、Webページを取得します。レスポンスのHTMLにローカルで設定したCookieの値が反映されていることが確認できます。


アプリケーションでCookieの値を書き換えることができました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2019-11-11
作成日: 2014-03-01
iPentec all rights reserverd.