PageStatePersister クラス
アセンブリ: System.Web (system.web.dll 内)


HTTP 要求および HTTP 応答には本質的に状態がありません。HTTP 要求間で状態情報を保持するために、ASP.NET サーバー ページには Page の状態を格納できます。この状態はビューステートと呼ばれ、ページとコントロールの設定、および、サーバーへの最後のラウンド トリップでユーザーが参照し操作したページやコントロールと同じページおよびコントロールとして表示できるようにするデータで構成されています。同一ページに対して連続して行われた要求間のビューステートを格納するための機構はいくつかあります。PageStatePersister 抽象クラスは、このような状態情報を格納するための基本クラスを表します。
ASP.NET の既定のビューステート永続化機構では、非表示の HTML 要素 (type 属性が "hidden" に設定された要素) 内に Base64 でエンコードされた文字列として状態情報が保持されます。ASP.NET ページでは、HiddenFieldPageStatePersister オブジェクトを使用してこの作業が行われます。その際、IStateFormatter インスタンスを使用してオブジェクトの状態情報の初期化と逆シリアル化が行われます。また、帯域幅とリソースに制限のあるモバイル クライアント用の SessionPageStatePersister クラスを使用して、サーバー上の Session オブジェクトにページのビューステートを格納することもできます。場合によっては、ビューステートの永続化を完全に無効にすることもできます。完全に無効にすると、状態の永続性に依存するページやコントロールは適切に動作しないことがあります。ページの状態管理とビューステートの詳細については、「ASP.NET の状態管理」を参照してください。
コントロールのコードを記述する際には、コントロールの状態情報を StateBag オブジェクトである ViewState ディクショナリに格納できます。その場合、開発者は ControlState プロパティからコントロールの状態を取得します。キーと値を ViewState プロパティに割り当てると、Page オブジェクトにより要求の状態情報がシリアル化されます。コントロールでカスタムの状態処理を行う場合は、LoadViewState と SaveViewState メソッドをオーバーライドします。このディクショナリに格納されている状態情報は、ページの開発者がビューステートを無効にすると失われます。このような損失を軽減するために、ASP.NET Version 2.0 では、コントロールの状態と呼ばれる別個のオブジェクトに重要な状態情報を格納できます。ページの開発者がビューステートを無効にしても、コントロールの状態オブジェクトは影響を受けません。コントロールの状態オブジェクトに状態情報を格納するには、コントロールで LoadControlState メソッドと SaveControlState メソッドをオーバーライドすることと、そのコントロールを登録し、コントロールが初期化されるたびに状態情報がコントロールの状態に格納されるようにすることが必要です。OnInit メソッドをオーバーライドし、RegisterRequiresControlState メソッドを呼び出すことにより、コントロールの状態を使用するように特定のコントロールを登録できます。コントロールの開発時の ViewState プロパティとコントロールの状態の使い方の詳細については、「ASP.NET カスタム サーバー コントロールの開発」を参照してください。
既存のビューステート永続化機構に対応していないクライアントでビューステートを保持するには、PageStatePersister クラスを拡張して独自のビューステート永続メソッドを使用し、ページ アダプタを使用して、ページが表示されるクライアントの種類に応じて異なるビューステート永続化機構を使用するように ASP.NET アプリケーションを構成できます。PageStatePersister クラスの派生クラスでは、Save 抽象メソッドをオーバーライドしてビューステートとコントロールの状態を永続媒体に格納し、Load メソッドをオーバーライドして格納したビューステートとコントロールの状態を抽出する必要があります。ビューステートとコントロールの状態をシリアル化して文字列にする必要がある場合は、StateFormatter プロパティからアクセスする IStateFormatter オブジェクトを使用できます。このオブジェクトを使用すると、Base64 でエンコードされた文字列にオブジェクトの状態情報をシリアル化する処理、および Base64 でエンコードされた文字列からオブジェクトの状態情報を逆シリアル化する処理が効率的に行われます。また、StateFormatter プロパティをオーバーライドして、オブジェクトの状態をシリアル化する独自の機構を提供することもできます。

Web サーバー上にビューステートとコントロールの状態を永続化する PageStatePersister オブジェクトを作成する方法を次のコード例に示します。StreamPageStatePersister は、Load メソッドおよび Save メソッドをオーバーライドし、ビューステート情報を抽出して永続化する方法を示しています。状態の永続化機構は状況に適した表示とクライアントの機能に関連するので、ASP.NET アプリケーションの StreamPageStatePersister をアクティブにするための MyPageAdapter クラスを用意しています。最後に、ブラウザ機能 (.browser) ファイルを指定して、MyPageAdapter アダプタを特定のクラスのクライアント (この例では、既定の Web ブラウザ) に対して有効にしています。
Imports System Imports System.IO Imports System.Security.Permissions Imports System.Web Imports System.Web.UI Namespace Samples.AspNet.VB ' The StreamPageStatePersister is an example view state ' persistence mechanism that persists view and control ' state on the Web server. ' <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)> _ Public Class StreamPageStatePersister Inherits PageStatePersister Public Sub New(ByVal page As Page) MyBase.New(page) End Sub 'New ' ' Load ViewState and ControlState. ' Public Overrides Sub Load() Dim stateStream As Stream stateStream = GetSecureStream() ' Read the state string, using the StateFormatter. Dim reader As New StreamReader(stateStream) Dim serializedStatePair As String serializedStatePair = reader.ReadToEnd Dim statePair As Pair Dim formatter As IStateFormatter formatter = Me.StateFormatter ' Deserilize returns the Pair object that is serialized in ' the Save method. statePair = CType(formatter.Deserialize(serializedStatePair), Pair) ViewState = statePair.First ControlState = statePair.Second reader.Close() stateStream.Close() End Sub ' Load ' ' Persist any ViewState and ControlState. ' Public Overrides Sub Save() If Not (ViewState Is Nothing) OrElse Not (ControlState Is Nothing) Then If Not (Page.Session Is Nothing) Then Dim stateStream As Stream stateStream = GetSecureStream() ' Write a state string, using the StateFormatter. Dim writer As New StreamWriter(stateStream) Dim formatter As IStateFormatter formatter = Me.StateFormatter Dim statePair As New Pair(ViewState, ControlState) Dim serializedState As String serializedState = formatter.Serialize(statePair) writer.Write(serializedState) writer.Close() stateStream.Close() Else Throw New InvalidOperationException("Session needed for StreamPageStatePersister.") End If End If End Sub 'Save ' Return a secure Stream for your environment. Private Function GetSecureStream() As Stream ' You must provide the implementation to build ' a secure Stream for your environment. Return Nothing End Function End Class End Namespace
namespace Samples.AspNet.CS { using System; using System.IO; using System.Security.Permissions; using System.Web; using System.Web.UI; // // The StreamPageStatePersister is an example view state // persistence mechanism that persists view and control // state on the Web server. // [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] public class StreamPageStatePersister : PageStatePersister { public StreamPageStatePersister(Page page) : base(page) { } // // Load ViewState and ControlState. // public override void Load() { Stream stateStream = GetSecureStream(); // Read the state string, using the StateFormatter. StreamReader reader = new StreamReader(stateStream); IStateFormatter formatter = this.StateFormatter; string fileContents = reader.ReadToEnd(); // Deserilize returns the Pair object that is serialized in // the Save method. Pair statePair = (Pair)formatter.Deserialize(fileContents); ViewState = statePair.First; ControlState = statePair.Second; reader.Close(); stateStream.Close(); } // // Persist any ViewState and ControlState. // public override void Save() { if (ViewState != null || ControlState != null) { if (Page.Session != null) { Stream stateStream = GetSecureStream(); StreamWriter writer = new StreamWriter(stateStream); IStateFormatter formatter = this.StateFormatter; Pair statePair = new Pair(ViewState, ControlState); // Serialize the statePair object to a string. string serializedState = formatter.Serialize(statePair); writer.Write(serializedState); writer.Close(); stateStream.Close(); } else throw new InvalidOperationException("Session needed for StreamPageStatePersister."); } } // Return a secure Stream for your environment. private Stream GetSecureStream() { // You must provide the implementation to build // a secure Stream for your environment. return null; } } }
PageAdapter クラスを作成する方法を次のコード例に示します。このクラスからは、ASP.NET Web ページのビューステートおよびコントロールの状態の永続化に使用する StreamPageStatePersister のインスタンスが返されます。
Imports System.Security.Permissions Imports System.Web Imports System.Web.UI Namespace Samples.AspNet.VB <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)> _ Public Class MyPageAdapter Inherits System.Web.UI.Adapters.PageAdapter Public Overrides Function GetStatePersister() As PageStatePersister Return New Samples.AspNet.VB.StreamPageStatePersister(Page) End Function 'GetStatePersister End Class 'MyPageAdapter End Namespace
namespace Samples.AspNet.CS { using System.Security.Permissions; using System.Web; using System.Web.UI; [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)] public class MyPageAdapter : System.Web.UI.Adapters.PageAdapter { public override PageStatePersister GetStatePersister() { return new Samples.AspNet.CS.StreamPageStatePersister(Page); } } }
これら 2 つのクラスをコンパイルして、サンプルの実行に使用できるアセンブリにします。その際、次のようなコンパイラのコマンド ラインを使用します。コンパイルされたアセンブリが ASP.NET アプリケーションのルートの下の \Bin ディレクトリに格納されている必要があります。
' C:\>vbc /t:library /out:C:\inetpub\wwwroot\bin\Samples.AspNet.VB.dll MyPageAdapter.vb TextFilePageStatePersister.vb '
// C:\>csc /t:library /out:C:\inetpub\wwwroot\bin\Samples.AspNet.CS.dll MyPageAdapter.cs TextFilePageStatePersister.cs // // C:\>
最後に、MyPageAdapter アダプタを有効にするために、ASP.NET アプリケーションのルートの下に Browsers という名前のディレクトリを作成し、構成情報を指定した .browser ファイルを含める必要があります。構成ファイル内の <refid> 要素は、Default.browser 構成ファイルで既定のブラウザに指定されている値をオーバーライドする構成であることを示しています。この例では、ASP.NET Web ページに対して MyPageAdapter を使用します (通常、これらのページにアダプタは使用されません)。

System.Web.UI.PageStatePersister
System.Web.UI.HiddenFieldPageStatePersister
System.Web.UI.SessionPageStatePersister


Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- PageStatePersister クラスのページへのリンク