連載
.NETでモバイル・サイト開発を始めよう

第4回 モバイルWebサイトにおけるセッションとビューステート

シグマコンサルティング 菅原 英治
2007/06/25
Page1 Page2

■5. セッションとビューステートについて

●5.1. クッキーレス・セッションについて

 モバイル・サイト開発において、セッションを利用するためには「クッキーレス・セッション」を利用することになるだろう。なぜならば、携帯電話をはじめとするほとんどのモバイル端末では、クッキーを利用することができないからである。

 クッキーレス・セッションの詳細や利用方法については、下記のページで詳しく説明されているので、それを参考にしてほしい。

 ここでは、ASP.NET 2.0から追加されたクッキーレス・セッションについて解説したい。

○5.1.1. ASP.NET 2.0のクッキーレス・セッション

 はじめに、ASP.NET 2.0で追加されたクッキーレス・セッションについてまとめる。下の表は、web.configファイルで定義するsessionState属性のcookieless要素に設定できる値について、ASP.NET 1.1とASP.NET 2.0で比較したものである。

ASP.NET 1.1 ASP.NET 2.0 値の説明
true UseUri クッキーを使用せず、クッキーレス・セッションを利用する
false UseCookies クッキーを常に使用する
AutoDetect ブラウザをデバイス・プロファイルで識別した結果による。 識別したブラウザがクッキーをサポートする場合は、クッキーが有効かを調査し、有効であればクッキーを使用する。 サポートしない場合、もしくはサポートするが有効になっていない場合は、クッキーレス・セッションを利用する
UseDeviceProfile ブラウザをデバイス・プロファイルで識別した結果による。 識別したブラウザがクッキーをサポートする場合は、クッキーが有効かを調査せずにクッキーを使用する。 サポートしない場合は、クッキーレス・セッションを利用する
web.configファイルで定義するsessionState属性のcookieless要素に設定できる値

 この表から、ASP.NET 2.0ではcookieless要素に設定できる値として、UseUri、UseCookies、AutoDetect、UseDeviceProfileの4つの値が追加されたことがわかるだろう。この4つの値のうち、UseUriとUseCookiesは、ASP.NET 1.1のtrueとfalseに該当する。つまり実質的には、AutoDetectとUseDeviceProfileが新規に追加された値といえる。

 さて、新規に追加されたAutoDetectとUseDeviceProfileについて説明したい。両者はともに、クライアントのブラウザを識別し、決定されたデバイス・プロファイルによって動作する。そして、そのデバイス・プロファイルがクッキーをサポートするか(つまりブラウザ情報のcookies属性がtrueか)により、両者は異なった動作をする。

 AutoDetectでは、デバイス・プロファイルがクッキーをサポートしていると判断された場合、ブラウザの現在のクッキーが有効かどうかを調査する。調査した結果、有効な場合はクッキーを使用する。それ以外(=サポートしない場合や無効な場合)は、クッキーレス・セッションを利用する。

 一方、UseDeviceProfileでは、デバイス・プロファイルがクッキーをサポートしていると判断された場合、ブラウザの現在のクッキーが有効かどうかにかかわらず、とにかくクッキーを使用する。サポートされていない場合は、クッキーレス・セッションを利用する。

 MSDNの「SessionStateSection.Cookieless プロパティ」の記述によると、UseDeviceProfileを利用して、必要なデバイスに対してのみクッキーレス・セッションを利用することを強く勧めている。しかし、そのためには、デバイス別のクッキーのサポートの可否を、適切にブラウザ定義ファイルに定義していく必要がある。

○5.1.2 AutoDetectの利用

 それでは、AutoDetectを利用する。利用するには、web.configファイルに以下の太字の記述を追加するとよい。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <sessionState cookieless="AutoDetect" />
  </system.web>
</configuration>
AutoDetectを利用するためのコード(web.config)
AutoDetectを利用するためには、web.configの<sessionState>要素のcookieless属性に“AutoDetect”を設定する。

 web.configファイルの修正が終わったら、実行して動作を確認してほしい。実行するページは、4.2.2のサンプルで作成したWebページ(m006.aspx)とする。IEとiモードHTMLシミュレータIIで、そのページを実行し、それぞれの動作の違いを確認してみよう。

 以下は、IEとiモードHTMLシミュレータIIで実行した結果のURLである(ポート番号や太字部分は実行する環境により変化する)。

【実行結果のURL】

  • IE
    http://localhost:1395/mobile/m006.aspx
  • iモードHTMLシミュレータII
    http://localhost:1395/mobile/(S(dxupqd552gwyab45pqguxbn5))/m006.aspx

 この結果を見ると、IEでのURLは通常のものだが、iモードHTMLシミュレータIIのURLはセッションIDが追加されていることが分かるだろう。つまりIEはクッキー・サポートをしているので通常どおり動作するのに対し、iモードHTMLシミュレータIIで実行した場合はクッキーレス・セッションとして動作していることが分かる。

 このように、AutoDetectを利用すると、アクセスしてくるクライアントがクッキーをサポートしているかどうかで、クッキーレス・セッションとして動作するかどうかを自動的に切り替えることが可能である。

○5.1.3 UseDeviceProfileの利用

 続いて、UseDeviceProfileを利用する。利用するにはweb.configファイルに以下の太字の記述を追加するとよい。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <sessionState cookieless="UseDeviceProfile" />
  </system.web>
</configuration>
UseDeviceProfileを利用するためのコード(web.config)
UseDeviceProfileを利用するためには、web.configの<sessionState>要素のcookieless属性に"UseDeviceProfile"を設定する。

 それでは、実行して動作を確認したい。実行するのは、5.1.2と同様に4.2.2のサンプルで作成したWebページ(m006.aspx)とする。ここでは、ウェブコンテンツヴューアを利用して確認する。

 まず、ウェブコンテンツヴューアを利用して実行結果のURLを確認してほしい。すると下記のようなURLとなることが確認できるだろう。この結果から、クッキーレス・セッションとして動作していることがわかる。

【実行結果のURL】

    http://localhost:1395/mobile/(S(a0v1bx45x2gpy22sf2ut2qu1))/m006.aspx

 続いて、第2回で作成したソフトバンク用のブラウザ定義ファイルに、太字のコードを追加し、再度動作を確認する。

<capabilities>
  <capability name="browser" value="WebContentsViewer" />
  <capability name="cookies" value="true" />
</capabilities>
ソフトバンク用のブラウザ定義ファイルの修正
デバイスがクッキーをサポートしていると設定する。

 実行すると、下記のURLとなることが確認できるだろう。この結果から、クッキーレス・セッションとして動作していないことがわかる。

【実行結果のURL】

    http://localhost:1395/mobile/m006.aspx

 以上の結果から、UseDeviceProfileの動作を理解できるだろう。クッキーレス・セッションとして動作するかどうかは、とにかくブラウザ情報のクッキー・サポートに従っている。デバイスが実際に、クッキーをサポートしているかは考慮されない。

●5.2. ビューステート利用時の注意点

 モバイル・サイトにおいて、ビューステートを利用することは可能である。ビューステートとは、フォーム上のテキストボックスに入力した値やリストボックスで選択した値などを、ポスト後も保存/復元するための仕組みである。通常のWebアプリケーションでは、テキストボックスの入力値は、Webサーバにポストすると破棄されてしまう。一方、ASP.NETでは、ビューステートを利用することによって、ポスト後にポストしたフォームに戻った際に(すなわちポストバックの際に)、テキストボックスの入力値を復元することができる。つまりASP.NETにおいて、ポストバック時において値が保持されているのは、ビューステートのおかげであると考えることができる。ビューステートについて詳しくは、MSDNの「ビューステートの概要」を参考にするとよい。

 モバイルWebサイトにおいて、ビューステートを利用するに当たって注意しておきたいことがある。それは、モバイルWebフォームは、ビューステートの一部情報や履歴情報を管理するためにセッションを利用する、ということである。つまり、ビューステートを利用したければセッションが有効でなければならない。そのことはモバイル・サイトにおいて、クッキーレス・セッションを利用する必要があることを意味する。詳細が知りたい場合は、MSDNの「ViewState の制御」を参考にするとよい。

 以下では、この「モバイルWebフォームは、ビューステートの一部情報や履歴情報を管理するためにセッションを利用する」ということを確認してみたい。まずweb.configファイルを修正し、クッキーレス・セッションを無効にする。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <sessionState cookieless="false" />
  </system.web>
</configuration>
クッキーレス・セッションを無効にするためのコード(web.config)
クッキーレス・セッションを無効にするためには、web.configの<sessionState>要素のcookieless属性に“false”を設定する。

 続いて、4.2.2のサンプルで作成したWebページ(m006.aspx)に、iモードHTMLシミュレータIIでアクセスする。そのままCommandコントロール(Command1)をクリックしてほしい。すると下の画面のようなエラー・ページが表示されるはずだ。

モバイルWebフォーム(m006.aspx)のエラー画面es)

 このエラーが発生する理由を説明しよう。

 4.2.2のサンプルで作成したWebページ(m006.aspx)ではSelectionListコントロールが利用されており、つまりSelectionListコントロールの選択値を保持するためにビューステートが利用されることになる。具体的には、Commandコントロール(Command1)をクリックすると、ポストバックが発生し、そのときこのページではビューステートからSelectionListコントロール選択値を読み込む。しかし、クッキーレス・セッションが無効に設定されているためビューステートを利用できず、このようなエラーとなるのである。

 以上の結果から、「モバイルWebフォームは、ビューステートの一部情報や履歴情報を管理するためにセッションを利用する」ということが結論付けられるだろう。つまり、モバイルWebサイトにおいてビューステートを利用するためには、セッションの利用が不可欠である。

 モバイルWebサイトはセッションを利用するために、利用しない場合に比べてページのスループットが下がるという点には注意が必要だ。これへの対処法として、先ほど紹介したMSDN「ViewState の制御」の「モバイル アプリケーションの ViewState の最適化」の項では、ビューステートの使用回数を減らすか、使用しない方針を検討するのも良いと述べられている。

 前回および今回で、モバイル・コントロールの利用時の心得と、セッション、ビューステートに関する注意点について解説した。本連載の内容を通じて、モバイル・サイト開発に必要な基礎的な知識を理解できたと思う。本連載によって、ASP.NETによるモバイル・サイト開発に挑戦しようという技術者が増加することを期待している。End of Article


 INDEX
  [連載].NETでモバイル・サイト開発を始めよう
  第4回 モバイルWebサイトにおけるセッションとビューステート
    1.SelectionListコントロールの利用
  2.セッションとビューステートについて
 
インデックス・ページヘ  「.NETでモバイル・サイト開発を始めよう」


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 記事ランキング

本日 月間