Web Client Software Factory February 2008
Web Client Software Factory - February 2008 がダウンロードできるようになりました。 ASP.NET MVC Framework もあるので、何を使うか (一緒に使うか) 悩みますね。
ViewState の情報を Session に保存する方法
概要
ViewState は、サーバ側のリソースを利用しないという利点があります。しかし、 GridView (または DataGrid) を使用する ViewState が非常に大きくなる場合があり、ネットワーク帯域が少ない環境でパフォーマンスが悪化します。
この記事では、 ViewState の情報を Session に保存する方法を紹介します。ただし、基本的には ViewState を使用する (そして、 ViewState のサイズを小さく保つ) のをおすすめします。
サイト全体で対応する方法
Web アプリケーションの失敗例: サイトの動きをスムーズに保つために気を付けたい ASP.NET の注意点トップ 10 -- MSDN Magazine, 2006 年 7 月 が参考になります。
基本的なステップは、以下の 2 ステップと非常に簡単です。
- カスタムページアダプタを作成
- 作成したカスタムページアダプタを既定のページアダプタに設定
カスタムページアダプタは、以下のように定義します。 GetStatePersister() をオーバーライドし、 SessionPageStatePersister クラスを返すようにします。
public class SessionPageStateAdapter : System.Web.UI.Adapters.PageAdapter { public override PageStatePersister GetStatePersister () { return new SessionPageStatePersister(this.Page); } }
次に、 App_Browsers フォルダ *1 の中に .browsers ファイルを作成してください。既定のページアダプタに SessionPageStateAdapter を指定するため、以下のように controlAdapters 要素を記述します。
<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.Page" adapterType="SessionPageStateAdapter" /> </controlAdapters> </browser> </browsers>
ページ単位に対応する方法
前述の Web アプリケーションの失敗例: サイトの動きをスムーズに保つために気を付けたい ASP.NET の注意点トップ 10 -- MSDN Magazine, 2006 年 7 月や@IT:.NETエンタープライズWebアプリケーション開発技術大全 Webアプリケーションの状態管理が参考になります。
以下のように、 Page クラスの LoadPageStateFromPersistenceMedium() と SavePageStateToPersistenceMedium() をオーバーライドし、 Session に保存するようにします。
protected override object LoadPageStateFromPersistenceMedium () { string key = Request.RawUrl + "_VIEWSTATE"; object state = Session[key]; return (state == null) ? base.LoadPageStateFromPersistenceMedium () : state; } protected override void SavePageStateToPersistenceMedium (object viewState) { string key = Request.RawUrl + "_VIEWSTATE"; Session[key] = viewState; }