spacer
spacer
開発者の談話室

GoogleのモバイルアドセンスはPHPやPerl用にプログラムコードが用意されているのですが、なぜかASPはあるのにASP.NET向けには用意されていません。

携帯のクリック広告は弊社のクリック報酬型広告 i-mobile:アイモバイルを使っていただきたいのですが、ASP.NET用のスクリプトを作成したので公開しておきます。

基本的にGoogleはAdSenseの画面で提供する以外のスクリプトを認めていないので、自己責任で利用してください 

 

下記のスクリプトをページ内の任意の箇所に設置して、HTMLの表示したい箇所で<%= googleShowAdSense( "ここに自分のIDを入力" ) %>を設置すればOKです。

<script runat="server"> private string googleColor( string v, long random ) { string googleColor; string[] colorArray; colorArray = v.Split( ",".ToCharArray() ); return colorArray[ random % colorArray.Length ]; } private string googleScreenRes() { string screenRes; string delimiter; string[] resArray; screenRes = Convert.ToString( Request[ "HTTP_UA_PIXELS" ] ); delimiter = "x"; if( screenRes == null || screenRes == string.Empty ) { screenRes = Convert.ToString( Request[ "HTTP_X_UP_DEVCAP_SCREENPIXELS" ] ); delimiter = ","; } if( screenRes == null || screenRes == string.Empty ) { return string.Empty; } resArray = screenRes.Split( delimiter.ToCharArray() ); if( resArray.Length == 2 ) { return "&u_w=" + resArray[ 0 ] + "&u_h=" + resArray[ 1 ]; } return string.Empty; } private string googleReferrer() { if( Request.UrlReferrer == null ) { return string.Empty; } return Request.UrlReferrer.AbsoluteUri; } private string googleShowAdSense( string userid ) { return googleShowAdSense( "", userid, "", "", "", "", "", true, "xhtml", "utf8" ); } private string googleShowAdSense( string channel, string userid, string bordercolor, string bgcolor, string linkcolor, string textcolor, string urlcolor, bool single, string markup, string encord ) { long googleDt; string googleScheme, googleHost; DateTime time = DateTime.Now.AddTicks( -( new DateTime( 1970, 1, 1 ).Ticks ) ); googleDt = time.Ticks / 10000; System.Text.Encoding enc = System.Text.Encoding.UTF8; string format = "mobile_double"; if( single ) { format = "mobile_single"; } string colorparam = string.Empty; if( bordercolor != string.Empty && bordercolor != string.Empty && bgcolor != string.Empty && linkcolor != string.Empty && textcolor != string.Empty && urlcolor != string.Empty ) { colorparam = "&color_border=" + googleColor( bordercolor, googleDt ) + "&color_bg=" + googleColor( bgcolor, googleDt ) + "&color_link=" + googleColor( linkcolor, googleDt ) + "&color_text=" + googleColor( textcolor, googleDt ) + "&color_url=" + googleColor( urlcolor, googleDt ); } string googleAdUrl; googleAdUrl = "http://pagead2.googlesyndication.com/pagead/ads?" + "ad_type=text" + "&channel=" + channel + "&client=" + userid + colorparam + "&dt=" + googleDt + "&format=mobile_single" + "&host=" + System.Web.HttpUtility.UrlEncode( Request.Url.GetLeftPart( UriPartial.Authority ), enc ) + "&ip=" + System.Web.HttpUtility.UrlEncode( Request.UserHostAddress, enc ) + "&markup=" + markup + "&oe=" + encord + "&output=" + markup + "&ref=" + System.Web.HttpUtility.UrlEncode( googleReferrer(), enc ) + "&url=" + System.Web.HttpUtility.UrlEncode( Request.Url.AbsoluteUri, enc ) + "&useragent=" + System.Web.HttpUtility.UrlEncode( Request.UserAgent, enc ) + googleScreenRes(); string googleAdOutput; System.Net.WebClient client = new System.Net.WebClient(); System.IO.Stream st = client.OpenRead( googleAdUrl ); System.IO.StreamReader sr = new System.IO.StreamReader( st ); googleAdOutput = sr.ReadToEnd(); sr.Close(); st.Close(); return googleAdOutput; } </script>

利用例: 基本色での表示

<html><body> <%= googleShowAdSense( "ca-mb-pub-5130513572354664" ) %> </body></html>

(注) IDは適当です。

利用例: チャネル・色を指定しての表示

<html><body> <%= googleShowAdSense( "0285258959", "ca-mb-pub-5130513572354664", "6699CC", "FFFFFF", "003366", "AECCEB", "AECCEB", false, "xhtml", "utf8" ) %> </body></html>

チャネルや色を指定する場合は上記のようにつかってください。
文字コードはASP.NETであればweb.configのGlobalizationで指定するのが一般的ですので、utf8のままで問題ないです。

なにか問題などありましたらフィードバックください。念のために繰り返しますが、自己責任のうえでお使いください。

ASP.NETはweb.config中のglobalizationを指定するだけで、文字コードを簡単に変更することができます。

      <globalization requestEncoding="UTF-8" responseEncoding="UTF-8"/>

PC向けのサイトではなにも考えずにUTF-8でサイトを構築してもいいのですが、携帯向けサイトですと、SHIF-JISでエンコードする必要があります。

      <globalization requestEncoding="Shift-JIS" responseEncoding="Shift-JIS"/>

この場合、ASP.NETのサーバオブジェクトは、クライアントからのポストデータをShift-JISエンコードとして自動処理します。

単一のページで、PCと携帯の両対応を目論む方の中には、「PC向けにはUTF-8で、携帯向けにはShift-JISで表示したい」と考えるかもしれません。(迷信ですが、SEO的にUTF-8のほうが良いと言われているため)

この場合、globalizationではUTF-8を指定しておき、UserAgentから携帯電話端末を識別して、Responseオブジェクトに1行追加するだけでShift-JISにすることができます。

      Response.ContentEncoding = System.Text.Encoding.GetEncoding( "Shift-JIS" );

ただし、これを行うと、Softbank&Vodafone端末で文字化けがおこります!

理由は、.NET FrameworkはDoCoMoとKDDIとJ-PHONEはご存知なのですが、「Vodafone?Softbank?だれそれ?」状態です。ですので、browser情報を追加する必要があります。

ASP.NETフォルダの追加からApp_Browsersフォルダを追加して、その中にVodafoneとSoftbankのための情報を追加してください。特に重要なのは下記の1行です。

        <capability name="preferredResponseEncoding"           value="shift_jis" />

アプリケーション単体ではなく、サーバ自体に設定を追加する場合は、こちらの記事を参考にしてください。

以上、ASP.NET 2.0の話です。ASP.NET 1.1の環境ではBrowser Capsで対応してください。

その他資料:

MSDNブラウザファイルのスキーマー

BrwoserCaps

最近では3.5GByte以上のメモリ搭載するために、64bitの開発環境を使うようになってないでしょうか。

Visual Studio 2005を使ってASP.NET 2.0以降の開発しかしていなければさほど問題はありませんが、ASP.NET 1.1の開発を続けている場合、64bit版の.Net Frameworkがリリースされていないという問題があります。

ASP.NET 1.1のソースを開発するには、下記のコマンドを実行します。

cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1

これで、IISを32ビットモードで動かすことができます。その後、ASP.NET 1.1をIISに登録してください。

v1.1.4322\aspnet_regiis.exe -i

64ビットモードに戻す場合は、下記のコマンドを実行します。

v1.1.4322\aspnet_regiis.exe -u

cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 0

Framework64\v2.0.50727\aspnet_regiis -i

最近では、ASP.NET 2.0が開発の主流です。両方開発する必要がなければ、64ビット環境でIISを実行することをお勧めします。64ビット環境で動作させることの最大の利点は、非ページプールメモリの最大値が256MByteから128GByteへ大幅に増大している点です。負荷テストをする際には必ず、本番環境と同じIISの構成にしてチェックしましょう。

ちなみに、32ビット環境ではIISマネージャーが正しく動作しないという問題もあります。このため、64ビットOSでIISを32ビットエミュレーションしていると、ASP.NETの実行環境を1.1と2.0で切り替えには、拡張子とISAPIフィルタの関連付けをひとつづず直す必要がでてきます(切り替えバッチファイルを作っておくのがよい)。

さらに、ほとんど使っている人はないでしょうが、Mobile Internet Toolkit を使っている場合、バージョンチェックにひっかかってInstallすらできません。この場合は仕方ないので、Web Matrixをインストールすることになります。

結論としては、ASP.NET 1.1の開発があるかぎり、64ビットOSに移行してはいけません

関連ページ

64 ビット版の Windows で 32 ビット版の ASP.NET 1.1 と 64 ビット版の ASP.NET 2.0 を切り替える方法

Microsoft ASP.NET 2.0 ホスティング展開ガイド

64 ビット コンピュータに ASP.NET 2.0 の32 ビット バージョンをインストールすると、 ASP.NET 状態サービス(Aspnet_state.exe)がインストールされません。

ファイルダウンロードするプログラムを作成する際にはHTTPヘッダに下記の表記を追加します。

Content-Disposition: attachement; filename=<ファイル名>

しかし、ダウンロードファイルに日本語や記号を含む場合、なにもしないと文字化けが発生します。
これは、各社のブラウザがContent-Dispositionのフォーマットに関する実装をRFC通りに実装していなため、英語圏以外で問題が発生しています。

ファイルをダウンロードする ASP.NET Web ページで日本語ファイル名が文字化けする
原因
Internet Explorerでは、Content-Disposition ヘッダが送信された場合、送られてきたコンテンツをそのままブラウザで開かずにファイルダウンロードダイアログを表示するようになっています。その際にこのヘッダの filename パラメータを利用している場合、このパラメータで渡されたファイル名をファイルの保存時の既定のファイル名にします。ただし、クライアントコンピュータのロケールを日本語にしている場合、Internet Explorer ではこのパラメータで渡された文字列 (ファイル名) を Shift-JIS でエンコードされているものとして処理します。
また、ASP.NET および .NET Framework では、構成ファイル globalization エントリ responseEncoding 属性の設定に関わらず、HTTP ヘッダを UTF-8 でエンコードして送信します。Internet Explorer では、UTF-8 でエンコードされたファイル名を Shift-JIS でエンコードされているものとして処理するため、ファイル名を正しく表示できません
Content-Disposition ヘッダのパラメータの文字コードのエンコード方式に関しては、RFC2231 に基づくべきですが、現行の Internet Explorer はこのエンコード方式をサポートしていません。 RFC2231 につきましては、以下の URL をご参照ください。

Microsoftではファイル名をURLエンコードして回避するようにと記載していますが、これですとFireFoxなどほかのブラウザで文字化けをしてしまします。

ブラウザ毎にContent-Dispositionの記載を変更できるのであれば、IE向けにはURLエンコードをし、FireFoxにはなにもしないという対処もあります。

ASP.NET環境であれば下記の対応をするのがもっともシンプルかとおもいます。

Response.HeaderEncoding  = System.Text.Encoding.GetEncoding( "SHIFT-JIS" );

IE用に強引にSHIFT-JIS送信してあげればいいわけです。
ただし、これでは一部文字がまだ文字化けします。化けるのは2バイトコードで考えた場合、下位バイトが「5C」、「7C」の場合です。
「予 (0x975c)」→「誉 (0x975f)」 「表 (0x955c)」→「廟 (0x955f)」

これを避けるためには、該当する文字をURLエンコーディングしてあげます。(すべてURLエンコーディングしないのは、一定以上の文字列長になった場合にファイル名を省略するのを避けるためです)

 

そのほか参考情報

ダウンロード時に日本語ファイル名が文字化け

MSDNフォーラム日本語ファイルのダウンロードについて

 

 



 
spacer
spacer