.NET TIPS

[ASP.NET]AdRotatorコントロールでクリック率を管理するには?

山田 祥寛
2005/03/11

 レガシーASP(ASP 3.0)では、あらかじめ設定された割合に従って広告バナーを切り替え表示するためのコンポーネントとして、Ad Rotatorコンポーネントが提供されていた(詳細は、MSDN内の「Ad Rotatorコンポーネント」を参照していただきたい)。Ad Rotatorコンポーネントは、ASP技術が登場した当初から公開されていた伝統的なコンポーネントであるということもあり、古くからのASPユーザーであれば、一度はお目にかかったことがあるのではないだろうか。またバナーの表示確率をテキスト・ファイル上で簡単に設定できることから、実際のサイト構築で重宝していたユーザーも多いはずだ。

 AdRotatorコントロールは、このAd RotatorコンポーネントのASP.NET版である。AdRotatorコントロールの基本的な使い方については、「Visual Studio.NETでプログラム・レス開発を学ぶ(中編)」をご覧いただくとして、本稿ではAdRotatorコントロールを利用して、広告バナーのクリック率をデータベースで管理する方法を紹介する。表示対クリック比は、広告バナーの掲載効果を客観的に把握するのに有効な指標となる。本稿のサンプルをバナー効果の定量分析に役立てていただきたい。

 次に今回作成するサンプル・プログラムの実行画面と、バナーの表示回数やクリック回数を管理しているテーブルのレコード例を次に示す。

本サンプルの実行画面
設定ファイルの内容に従って、バナーを切り替えて表示する。
 
本サンプルの実行により作成されるレコードの例
バナーの表示回数(d_cntカラム)、クリック回数(cntカラム)が、リンク先のURL単位でデータベースに保存される。

 なお、本稿のサンプル・プログラムを利用する場合には、あらかじめデータベース・サーバ上に以下のようなaccessLogテーブルを作成しておく必要がある。

フィールド名 データ型 概要
url VARCHAR(255) リンク先のURL(主キー)
d_cnt INT バナーの表示数(初期値:0)
cnt INT バナーのクリック数(初期値:0)
accessLogテーブルのフィールド・レイアウト

 それではさっそく、具体的な手順を見ていくことにしよう。

1. 広告スケジュール・ファイルを設定する

 AdRotatorコントロールを制御するのは、「広告スケジュール・ファイル」と呼ばれるXML形式の設定ファイルの役割だ。拡張子は「.xml」としても構わないが、その場合にはエンド・ユーザーに対して内部的な設定内容が露出してしまう危険性がある。こうした内部的な情報ファイルは、エンド・ユーザーから直接にアクセスできない拡張子「.config」としておくのが好ましい。

 広告スケジュール・ファイルでは、バナー画像のURL、リンク先、代替テキスト、キーワード、表示確率(重み付け)などの項目を設定可能だ。また、本稿では紹介しないが、<Ad>要素の配下に任意のカスタム要素を指定することで、アプリケーション独自の情報を管理することもできる。カスタム要素の利用方法については、「TIPS:[ASP.NET]AdRotatorコントロールで任意の付加情報を表示するには?」で紹介している。

 以下は、今回のサンプル・プログラムで使用する広告スケジュール・ファイルである。

<?xml version="1.0" encoding="Shift_JIS" ?>
<Advertisements>
  <Ad>
    <ImageUrl>
      http://www.atmarkit.co.jp/fdotnet/asp2review/index/asp2review_l.jpg
    </ImageUrl>
    <NavigateUrl>
      http://www.atmarkit.co.jp/fdotnet/asp2review/index/index.html
    </NavigateUrl>
    <AlternateText>ASP.NET 2.0が変えるWebアプリ開発の世界</AlternateText>
    <Keyword>ASP.NET</Keyword>
    <Impressions>40</Impressions>
  </Ad>
  <Ad>
    <ImageUrl>
      http://www.atmarkit.co.jp/fdotnet/special/aspstruts01/aspstruts_l.jpg
    </ImageUrl>
    <NavigateUrl>
      http://www.atmarkit.co.jp/fdotnet/special/aspstruts01/aspstruts01_01.html
    </NavigateUrl>
    <AlternateText>ASP.NET vs. Strutsフレームワーク徹底比較</AlternateText>
    <Keyword>ASP.NET</Keyword>
    <Impressions>20</Impressions>
  </Ad>
  <Ad>
    <ImageUrl>
      http://www.atmarkit.co.jp/fjava/javatips/images/java_tips_title.gif
    </ImageUrl>
    <NavigateUrl>
      http://www.atmarkit.co.jp/fjava/javatips/index.html
    </NavigateUrl>
    <AlternateText>Java TIPS</AlternateText>
    <Keyword>Java</Keyword>
    <Impressions>20</Impressions>
  </Ad>
  <Ad>
    <ImageUrl>
      http://www.atmarkit.co.jp/fdb/rensai/oodbrevive01/top.gif
    </ImageUrl>
    <NavigateUrl>
      http://www.atmarkit.co.jp/fdb/rensai/oodbrevive01/oodbrevive01_1.html
    </NavigateUrl>
    <AlternateText>オブジェクト指向データベースの復権</AlternateText>
    <Keyword>Database</Keyword>
    <Impressions>20</Impressions>
  </Ad>
</Advertisements>
広告バナーの情報を管理するXMLファイル(ad.config)

 この広告スケジュール・ファイルの設定では、重み付け(<Impressions>要素の値)が、それぞれ40、20、20、20であるので、例えば「ASP.NET 2.0が変えるWebアプリ開発の世界」のバナーは40%の確率で表示されることになる。

2. AdRotatorコントロールで広告バナーを表示する

 次に、Webフォームであるad_cs.aspx(ad_vb.aspx)で広告スケジュール・ファイルをAdRotatorコントロールに関連付けよう。また、広告バナーの表示カウントをデータベースに記録するのも、このWebフォームの役割だ。以下にそのコードを示す。

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
// 広告バナーを生成するタイミングで実行
void ad_AdCreated(Object sender, AdCreatedEventArgs e){
  SqlConnection objDb = new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
  // accessLogテーブルをリンク先URLで検索し、
  // すでに該当するレコードが存在する場合には
 
// 該当レコードを更新、さもなければ新規レコードを登録
  SqlCommand objCom1 = new SqlCommand("SELECT * FROM accessLog WHERE url=@url", objDb);
  objCom1.Parameters.Add("@url", e.NavigateUrl.Trim());
  objDb.Open();
  SqlDataReader objDr = objCom1.ExecuteReader();
  SqlCommand objCom2;
  if (!objDr.HasRows) {
    objCom2 = new SqlCommand("INSERT INTO accessLog(url,d_cnt) VALUES(@url,1)", objDb);
  } else {
    objCom2 = new SqlCommand("UPDATE accessLog SET d_cnt=d_cnt+1 WHERE url=@url", objDb);
  }
  objDr.Close();
  objCom2.Parameters.Add("@url", e.NavigateUrl.Trim());
  objCom2.ExecuteNonQuery();
  objDb.Close();
  // AdRotatorコントロールで指定されたNavigateUrl属性をリライトする
  // add_logging_cs.aspxはバナー・クリック時に呼び出され、
  // クリック数の記録を行う
  e.NavigateUrl = "ad_logging_cs.aspx?url=" + e.NavigateUrl;
}
</script>
<html>
<head>
<title>広告バナーのクリック率を記録する</title>
</head>
<body>
<form runat="Server">
  <%--広告スケジュール・ファイルの関連付けはAdvertisementFile属性で行う--%>
  <asp:AdRotator id="ad" runat="Server"
    AdvertisementFile="ad.config" Target="_blank"
    OnAdCreated="ad_AdCreated" />
</form>
</body>
</html>
広告バナーを循環表示するためのWebフォーム(C#版:ad_cs.aspx)
 
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
' 広告バナーを生成するタイミングで実行
Sub ad_AdCreated(sender As Object, e As AdCreatedEventArgs)
  Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
  ' accessLogテーブルをリンク先URLで検索し、
  ' すでに該当するレコードが存在する場合には
 
' 該当レコードを更新、さもなければ新規レコードを登録
  Dim objCom1 As New SqlCommand("SELECT * FROM accessLog WHERE url=@url",objDb)
  objCom1.Parameters.Add("@url",e.NavigateUrl.Trim())
  objDb.Open()
  Dim objDr As SqlDataReader=objCom1.ExecuteReader()
  Dim objCom2 As SqlCommand
  If Not objDr.HasRows Then
    objCom2=New SqlCommand("INSERT INTO accessLog(url,d_cnt) VALUES(@url,1)",objDb)
  Else
    objCom2=New SqlCommand("UPDATE accessLog SET d_cnt=d_cnt+1 WHERE url=@url",objDb)
  End If
  objDr.Close()
  objCom2.Parameters.Add("@url",e.NavigateUrl.Trim())
  objCom2.ExecuteNonQuery()
  objDb.Close()
  ' AdRotatorコントロールで指定されたNavigateUrl属性をリライトする
  ' add_logging_vb.aspxはバナー・クリック時に呼び出され、
  ' クリック数の記録を行う
  e.NavigateUrl="ad_logging_vb.aspx?url=" & e.NavigateUrl
End Sub
</script>
<html>
<head>
<title>広告バナーのクリック率を記録する</title>
</head>
<body>
<form runat="Server">
  <%--広告スケジュール・ファイルの関連付けはAdvertisementFile属性で行う--%>
  <asp:AdRotator id="ad" runat="Server"
    AdvertisementFile="ad.config" Target="_blank"
    OnAdCreated="ad_AdCreated" />
</form>
</body>
</html>
広告バナーを循環表示するためのWebフォーム(VB.NET版:ad_vb.aspx)

 AdCreatedイベントは、AdRotatorコントロールが広告バナーを表示するタイミングで発生するイベントだ。ここでは、このAdCreatedイベントを利用することで、広告バナーのリンク先(AdCreatedEventArgsオブジェクトのNavigateUrlプロパティ)をキーとして、広告バナーのカウンタをインクリメントしているわけだ。

 なお、AdCreatedEventArgsオブジェクトを介することで、リンク先のURLだけではなく、表示対象のバナー情報全般を取得することができる。AdCreatedEventArgsオブジェクトに属するプロパティは以下のとおり。

プロパティ 概要
AdProperties カスタム要素の値(System.Collections名前空間のIDictionaryオブジェクト)
AlternateText 代替テキスト
ImageUrl バナー画像のURL
NavigateUrl 広告バナーのリンク先
AdCreatedEventArgsオブジェクトで利用可能な主なプロパティ

3. 広告バナーのクリックをデータベースに記録する

 最後に、広告バナーがクリックされたタイミングでログ出力を行うのが、ad_logging_cs.aspx(ad_logging_vb.aspx)の役割である。バナーがクリックされたタイミングでは、必ずこのaspxファイルを経由することで、バナーのクリック数をデータベースに記録することができる(なお上記コードでは、表示バナーのリンク先であるAdCreatedEventArgsオブジェクトのNavigateUrlプロパティを書き換えることで、このaspxファイルを経由させている)。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
void Page_Load(Object sender, EventArgs e){
  SqlConnection objDb=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
  // リンク先のURLについてクリック数を1インクリメント
  SqlCommand objCom = new SqlCommand("UPDATE accessLog SET cnt=cnt+1 WHERE url=@url", objDb);
  objCom.Parameters.Add("@url", Request.QueryString["url"]);
  objDb.Open();
  objCom.ExecuteNonQuery();
  objDb.Close();
  // ロギング処理の後、目的のURLにリダイレクト
  Response.Redirect(Request.QueryString["url"]);
}
</script>
バナーのクリック数をカウントするWebフォーム(C#版:ad_logging_cs.aspx)
 
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
Sub Page_Load(sender As Object, e As EventArgs)
  Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
  ' リンク先のURLについてクリック数を1インクリメント
  Dim objCom As New SqlCommand("UPDATE accessLog SET cnt=cnt+1 WHERE url=@url",objDb)
  objCom.Parameters.Add("@url",Request.QueryString("url"))
  objDb.Open()
  objCom.ExecuteNonQuery()
  objDb.Close()
  ' ロギング処理の後、目的のURLにリダイレクト
  Response.Redirect(Request.QueryString("url"))
End Sub
</script>
バナーのクリック数をカウントするWebフォーム(VB.NET版:ad_logging_vb.aspx)

 以上で一連の準備は完了だ。

 ad_cs.aspx(あるいはad_vb.aspx)を実行し、広告バナーが循環表示されていること、各バナーの表示数/クリック数が正しくデータベース上に登録されていることを確認してみよう。本稿冒頭のようなテーブル内容が得られれば成功だ。End of Article

カテゴリ:Webフォーム 処理対象:AdRotatorコントロール
使用ライブラリ:AdRotatorコントロール
使用ライブラリ:AdCreatedEventArgsクラス(System.Web.UI.WebControls名前空間)
関連TIPS:[ASP.NET]AdRotatorコントロールで任意の付加情報を表示するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]AdRotatorコントロールで任意の付加情報を表示するには?
[ASP.NET]AdRotatorコントロールでデータベースから広告情報を取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間