セッション変数を保存する効率的な方法は何ですか

asp.net
セッション変数を保存する効率的な方法は何ですか

asp.netアプリケーションが負荷分散システムに展開されています。 そして、セッション全体でユーザーの役割(文字列)を保持したいだけです。 asp.netのセッション情報はデータベースに保存されると言われたので、ユーザーがページを切り替えるたびにasp.netエンジンがDB ecahにアクセスするのは望ましくありません。 また、ユーザーのロールを確認する必要があるたびに自分のDBからロールを取得する必要もありません。 私は、隠されたフィールドにロール情報を保存する方法があることを知っています。 一定のセッション値を保存する効率的な方法は何ですか?

  1  1


ベストアンサー

セッションには3つのモードがあります。 モード設定では、inproc、sqlserver、stateserverの3つのオプションがサポートされています。 ロードバランスが必要な場合、インプロセスは自動的にアウトになります。 sqlserverまたはstateserverを使用するように構成できます。

1


DBアクセスを回避する場合は、セッション状態の代わりにCookieを使用してユーザーのロールを保存できます。 セキュリティ上の理由で(おそらくセッションIDをキーの一部として使用する必要がある場合)、Cookieを暗号化/エンコードできます。 Cookieは、リクエストごとにブラウザからサーバーに送信されるため、負荷分散シナリオでは正常に機能します。 ブラウザがアタッチするURLを制限するために、Cookie(および場合によってはHttpOnly)のパス属性を必ず設定してください。

組み込みのASP.NETメンバーシッププロバイダーを使用している場合、ロールメンバーシップおよび関連する詳細はプロバイダーによって自動的に処理されることに注意してください。

1


クッキーを使用することもできます。 セッションデータは既定でメモリに格納されるため、ファーム内のすべてのサーバーで使用できるようにデータベースに格納するように構成されていると思います。 メモリに保存できる場合は、このアプローチを使用して負荷分散を処理できます。

if (Session["Role"] == null)
   Session["Role"] = GetUserRole();

これにより、サーバーごとに1回だけデータベースにアクセスします。

セッション状態の詳細http://msdn.microsoft.com/en-us/library/ms178581.aspx [こちら]。

0


「ロール」がアクセス許可と関係がある場合は、隠しフィールドまたはasp.netを話すビューステートなどでクライアント側から編集できるようにする他の手段に保存することはお勧めできません。

特にパフォーマンスを向上させるためにセッションを使用している場合、私はセッションを大嫌いです。 おそらく本当に必要なのはキャッシングであり、そこには多くの優れたソリューションがあります。 すぐに、asp.netに組み込まれ、ページクラスのメンバーとして公開されるキャッシュデータディクショナリを利用できます。 キャッシュは基本的に、キャッシュに入れたものをすべてシリアル化し、メモリに保存します。 キャッシュオブジェクトの使用は、単一のサーバーセットアップで最適に機能します。 負荷分散を使用しているため、おそらくhttp://memcached.org/[Memcached]やhttp://msdn.microsoft.com/en-us/data/cc655792.aspxのような分散キャッシュシステムを利用したいと思うでしょう。 [AppFabric Caching](以前のコードネームVelocity)。 MemcahedはTwitterなどの多くの大規模なサイトで使用されており、AppFabricは新しいMicrosoft製品であり、Asp.Netなどの他のMicrosoftテクノロジーとの良好なサポートおよび統合が必要になっています。

分散キャッシュを使用すると、データベースに戻る必要がなくなり、基本的にキャッシュへの旅行と引き換えになります。 これがスターターにとってより効率的である理由は、データベースがすべてを保存しなければならないので、キャッシュは最近アクセスされたアイテムを効率的に保存することだけを心配する必要があるからです。

また、ロードバランサーでサーバーアフィニティを使用している場合、分散キャッシュルートを回避することを選択できることを指摘しておきます。 技術的には、サーバーアフィニティなしでも使用できますが、キャッシュミスが多くなります。

0


タイトルとURLをコピーしました