ASP.NET MVCでのセッション設定
4607 ワード
最近ASP.NET MVCプロジェクトでは、1つのコントローラにセッションが設定されているが、別のコントローラのコンストラクション関数ではセッションを取得できず、「System.NullReferenceException」エラーが表示される場合がある.なぜなら、コントローラコンストラクション関数でSession値を取得し、そのコントローラの複数のactionを共有するためにグローバル変数に値を割り当てることが望ましいからです.
最初はASPだと思っていた.NET State Serviceがオープンしていないか、Web.configでsessionStateノードの構成が間違っていて、結果はすべてではありません.最終発見:ASP.NETではセッションはactionにのみ存在し,controllerコンストラクション関数でセッションを取得することはできない.
では、ASP.NET Sessionはいったいどのように働いていますか?ASP.NET MVCでactionはどのようにセシオンを獲得しますか?
なぜセシオンが必要なの?
ASP.NETページは「ステータスなし」です.これは、サーバに要求を送信するたびに、サーバがページのインスタンスを生成することを意味します.しかし、ショッピングカートやユーザー登録など、異なるページ間で情報を共有したい場合があります.そこで、ASP.NETはサービス側のSessionメカニズムを提供してくれた.
Sessionはどのように働いていますか.
サービス側のSessionメカニズムはクライアントベースであり、つまりサービス側のSessionは各クライアントの情報をサービス側メモリに保存する.具体的な手順は、→クライアントがサービス側に要求する→サービス側がクライアントに応答し、そのクライアントに対してSessionと一意のSession IDを作成する→Session IDをkeyとし、SessionコンテンツをvalueとしてSession State Providerにキー値対で格納→クライアントが専用のSession IDを持って再びサービス側に要求する→サービス側のSessionメカニズムがクライアントのSession IDに基づいて、Session State Providerからコンテンツを取り出してクライアントに返す
利点:●ページをまたいでユーザーの状態を維持し、情報●使い勝手が良く、あらゆる種類の情報を保存できる●各クライアントの情報を保存できる●安全で透明な
欠点:●Sessionはサービス側のメモリに保存されているため、クライアント要求が増えるにつれて性能に影響を及ぼす可能性が高い●Web.conigでは、sessionStateノードのmodeプロパティが、「StateServer」または「SQLServer」に設定されている場合は、Sessionに格納されているオブジェクトに[Serializable]を打つ必要があります.このようにセシオンを記憶・読み出しする際には,シーケンス化と逆シーケンス化が絶えず行われ,性能にも影響を及ぼす.
SessionのMode
Web.configではsessionStateノードにmode属性があり、その属性値はSessionのModeを表す.含む:●InProc●StateServer●SQLServer●Custom●Off
各Modeの設定は、SessionメカニズムがどのSession State Providerを採用するかに影響します.
□ Off
セッションを無効にしたい場合は、
□ InProc
これもASP.NET Sessionメカニズムで選択したデフォルトのModeは、現在のアプリケーションドメインのデータのみを保存します.サーバーを再起動すると、Sessionが保存したデータはすべて失われます.
セシオンの有効期間が30分であることを示します.小さなサイトやデータ量が少ない場合は、このモードを選んだほうがいいです.
利点:●Sessionデータをメモリに保存しているため、取得が非常に速い●シーケンス化や逆シーケンス化の要求がない
欠点:●アプリケーションドメインが廃棄、再起動された場合、Sessionデータが失われる●データ量が多い場合、メモリを消費しすぎ、パフォーマンスに影響する
□ StateServer
このオプションを選択すると、セッションの作業を現在のアプリケーションドメイン以外のaspに任せることを意味します.net_state.exeサービスは、IIS以外のWindowsサービスとは独立しています.このサービスを開始するには、「コントロールパネル--管理ツール--サービス」を開くことで、ASPを見つけることができます.NET State Serviceというサービスは、自動起動にします.
ASPを再起動してもNETプロセス、Sessionは依然として有効であり、これはStateServerモードの利点である.このモードの欠点は、シーケンス化と逆シーケンス化が多すぎることです.
●127.0.0.1デフォルト選択自機●42424デフォルトポート●stateNetworkTimeoutサーバ応答、クライアント要求待ち時間を設定するために使用され、デフォルトは10秒、ここでは40秒に設定されている
StateServerのデフォルト設定を変更する場合はasp.net_state.exe対応のレジストリで変更します.
参考資料:
http://www.cnblogs.com/ghd258/archive/2006/02/28/339443.htmlhttp://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net
転載先:https://www.cnblogs.com/zoro-zero/p/4587900.html
最初はASPだと思っていた.NET State Serviceがオープンしていないか、Web.configでsessionStateノードの構成が間違っていて、結果はすべてではありません.最終発見:ASP.NETではセッションはactionにのみ存在し,controllerコンストラクション関数でセッションを取得することはできない.
では、ASP.NET Sessionはいったいどのように働いていますか?ASP.NET MVCでactionはどのようにセシオンを獲得しますか?
なぜセシオンが必要なの?
ASP.NETページは「ステータスなし」です.これは、サーバに要求を送信するたびに、サーバがページのインスタンスを生成することを意味します.しかし、ショッピングカートやユーザー登録など、異なるページ間で情報を共有したい場合があります.そこで、ASP.NETはサービス側のSessionメカニズムを提供してくれた.
Sessionはどのように働いていますか.
サービス側のSessionメカニズムはクライアントベースであり、つまりサービス側のSessionは各クライアントの情報をサービス側メモリに保存する.具体的な手順は、→クライアントがサービス側に要求する→サービス側がクライアントに応答し、そのクライアントに対してSessionと一意のSession IDを作成する→Session IDをkeyとし、SessionコンテンツをvalueとしてSession State Providerにキー値対で格納→クライアントが専用のSession IDを持って再びサービス側に要求する→サービス側のSessionメカニズムがクライアントのSession IDに基づいて、Session State Providerからコンテンツを取り出してクライアントに返す
利点:●ページをまたいでユーザーの状態を維持し、情報●使い勝手が良く、あらゆる種類の情報を保存できる●各クライアントの情報を保存できる●安全で透明な
欠点:●Sessionはサービス側のメモリに保存されているため、クライアント要求が増えるにつれて性能に影響を及ぼす可能性が高い●Web.conigでは、sessionStateノードのmodeプロパティが、「StateServer」または「SQLServer」に設定されている場合は、Sessionに格納されているオブジェクトに[Serializable]を打つ必要があります.このようにセシオンを記憶・読み出しする際には,シーケンス化と逆シーケンス化が絶えず行われ,性能にも影響を及ぼす.
SessionのMode
Web.configではsessionStateノードにmode属性があり、その属性値はSessionのModeを表す.含む:●InProc●StateServer●SQLServer●Custom●Off
各Modeの設定は、SessionメカニズムがどのSession State Providerを採用するかに影響します.
□ Off
セッションを無効にしたい場合は、
<system.web>
<sessionState mode="off" />
sytem.web>
□ InProc
これもASP.NET Sessionメカニズムで選択したデフォルトのModeは、現在のアプリケーションドメインのデータのみを保存します.サーバーを再起動すると、Sessionが保存したデータはすべて失われます.
<system.web>
<sessionState mode="InProc" timeout="30" />
system.web>
セシオンの有効期間が30分であることを示します.小さなサイトやデータ量が少ない場合は、このモードを選んだほうがいいです.
利点:●Sessionデータをメモリに保存しているため、取得が非常に速い●シーケンス化や逆シーケンス化の要求がない
欠点:●アプリケーションドメインが廃棄、再起動された場合、Sessionデータが失われる●データ量が多い場合、メモリを消費しすぎ、パフォーマンスに影響する
□ StateServer
このオプションを選択すると、セッションの作業を現在のアプリケーションドメイン以外のaspに任せることを意味します.net_state.exeサービスは、IIS以外のWindowsサービスとは独立しています.このサービスを開始するには、「コントロールパネル--管理ツール--サービス」を開くことで、ASPを見つけることができます.NET State Serviceというサービスは、自動起動にします.
ASPを再起動してもNETプロセス、Sessionは依然として有効であり、これはStateServerモードの利点である.このモードの欠点は、シーケンス化と逆シーケンス化が多すぎることです.
<system.web>
<sessionState mode="StateServer" stateConnectionSting="tcpip=127.0.0.1:42424" stateNetworkTimeout="40" />
sytem.web>
●127.0.0.1デフォルト選択自機●42424デフォルトポート●stateNetworkTimeoutサーバ応答、クライアント要求待ち時間を設定するために使用され、デフォルトは10秒、ここでは40秒に設定されている
StateServerのデフォルト設定を変更する場合はasp.net_state.exe対応のレジストリで変更します.
参考資料:
http://www.cnblogs.com/ghd258/archive/2006/02/28/339443.htmlhttp://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net
転載先:https://www.cnblogs.com/zoro-zero/p/4587900.html