|
.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)を実行し、広告バナーが循環表示されていること、各バナーの表示数/クリック数が正しくデータベース上に登録されていることを確認してみよう。本稿冒頭のようなテーブル内容が得られれば成功だ。
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間