68

キャッシュ VS セッション VS Cookie についてすべきこととすべきでないことは何ですか?

例:
私はセッション変数を頻繁に使用していますが、ユーザーが商品の注文を開始してからランチに行き、数時間後に戻ってきて予約を続けると、予約アプリケーションで問題が発生することがあります。ユーザーが予約を確認または中止するまで予約をセッションに保存するので、ユーザーがブラウザーで X をクリックするだけで戻ってこない場合に、データベースと対話してデータベースの途中で予約を処理する必要はありません。

代わりに、キャッシュまたはクッキー、またはこれを組み合わせて使用​​する必要がありますか?

(また、アプリにエラーが発生した場合、セッションオブジェクトがリセットされ、そのためにさらに問題が発生します)

私は主にデスクトッププログラミングを行っており、ここで多くの知識が不足していると感じているため、キャッシュ、セッション、Cookie (または db) を使用する場所を拡張できる人なら誰でも感謝します

編集:回答から、DB と Cookie の組み合わせが必要なようです。

  1. セッションIDに接続されたデータベースに予約を保存する必要があります
  2. セッション ID を Cookie に保存します (暗号化)。
  3. すべてのページの読み込みで Cookie をチェックし、データベースから予約を取得します
  4. 週に 1 回実行され、未完了の予約をクリアするクリーンアップ手順があります。

ユーザーが価格やその他の機密データを変更する可能性があり、すべてを検証する必要があった (データを信頼できない) ため、予約を Cookie として保存することはできません。

私はそれを正しく理解していますか?

そして、みなさんの素晴らしい説明に感謝します!

4

8 に答える 8

99

状態管理は、デスクトップ アプリケーションの観点から Web の世界に到達する際に習得しなければならない重要なことです。

  • Sessionサーバー上の現在の Web セッションに関するユーザーごとの情報を格納するために使用されます。データベース サーバーをバックエンド ストアとして使用することをサポートします。
  • Cookie現在の Web セッションのユーザーごとの情報またはクライアント上の永続的な情報を保存するために使用する必要があります。したがって、クライアントは Cookie の内容を制御できます。
  • Cacheオブジェクトは、単一のアプリケーション内のユーザー間で共有されます。その主な目的は、データ ストアからのデータをキャッシュすることであり、プライマリ ストレージとして使用しないでください。自動無効化機能をサポートしています。
  • Applicationオブジェクトは、アプリケーション全体の状態を保存するためにユーザー間で共有されるため、それに応じて使用する必要があります。

アプリケーションが多数の認証されていないユーザーによって使用されている場合は、データを Cookie に保存することをお勧めします。認証が必要な場合は、データベースにデータを手動で保存するか、ASP.NET プロファイル管理機能を使用できます。

于 2009-02-16T12:46:25.440 に答える
4

Web は本質的に切断されたモデルであり、言及されているオプション (セッション、アプリケーション、キャッシュなど) のどれも十分に信頼できるものではありません。セッションはタイムアウトし、ワーカー プロセスはリサイクルされます。

ユーザーの進行状況を確実に長期間保存する必要がある場合は、データベースが唯一のソリューションです。ユーザー プロファイルがある場合 (ユーザーがログインする必要がある場合)、それは簡単です。そうでない場合は、一意の ID を生成して Cookie (または URL) に保存し、その ID に基づいてユーザーを追跡します。

Id が暗号化されていることを確認してから、数値だけでなく、base64 でエンコードされた文字列であることを確認してください。

編集:

Mehrdad Afshari からの元の質問とコメントでの追加の説明の後、Session を使用し、ストレージを InProc ではなく Sql Server に設定することをお勧めします。

セットアップ方法の詳細と手順は次のとおりです: http://msdn.microsoft.com/en-us/library/ms178586.aspx

セッション タイムアウトは引き続き発生しますが、アプリケーション プールのリサイクルやサーバーの再起動後も存続することに注意してください。

永続的なストレージが本当に必要な場合は、最初に説明したように、データベースを使用したカスタム ソリューションが唯一のソリューションです。

于 2009-02-16T12:46:43.663 に答える
3

サーバーに保存されたセッションは、デフォルトで 20 分でタイムアウトします (これは調整可能です)。タイムアウトを防ぐために、これを Cookie またはビューステート (利用可能な場合) に保存します。

状態が InProc (デフォルト設定) に保存されている場合、ファーム内に複数のサーバーがあると、ユーザーを同じサーバーに保持する何らかの「スティッキー セッション」を実装していない限り、問題が発生します。後続の呼び出しのためにファームします。

可能な場合はセッションを回避し(サーバーに余分な負荷とメモリを使用します)、可能な場合はビューステートをオフにしてページサイズを小さく保ちます。多くの場合、Cookie は最も軽量なオプションですが、ユーザーがこれをオフにしている可能性があり、サイトを引き続き使用できるようにするフォールバック モードが必要になります。

編集(質問者からの回答に基づいて説明を追加):

Viewstate は隠しフィールドに格納され、Viewstate ストレージ内のすべてのオブジェクトのシリアル化された表現です。Viewstate は、ページの状態を格納するために自動的に使用されますが、必要に応じて、プログラムによって Viewstate に独自のオブジェクトを明示的に追加したり、Viewstate から取得したりできます。

はい、データセットは Viewstate に保存できます。

于 2009-02-16T12:45:55.303 に答える
2

まず知っておくべきこと!Cookie はセッションで使用されます。サーバーは、リクエストごとにクライアントとサーバーの間で交換される Cookie のおかげで、ユーザーが誰であるかを認識します (これは、HTTP ヘッダーの set-cookie および cookie で機能します)。

本当の質問は次のとおりです。

  • ナビゲーション中にユーザー情報を保存する場合は、セッションを使用する必要があります。

  • クライアントが Cookie をサポートしていない場合は、各リクエスト内に URL にエンコードされた Cookie を保存することを決定できます (サーバーは Cookie の代わりに URL を使用して、リクエストに適したセッションを見つけます)。

次に、セッションをどこに保存するかを検討します
。サイトに高い分散性と高いパフォーマンスが必要な場合は、セッションをプロセス内ではなくデータベース内に保存する必要があります。このようにして、複数の Web サーバー間で作業を共有することができます。ただし、(セッションに保存するオブジェクトはシリアライズ可能でなければならないため) 単純さが失われ、Web サーバーとデータベース サーバーの間でもう 1 回往復する必要があります。

于 2009-02-16T12:55:51.753 に答える
1

キャッシュはすべてのユーザー間で共有されるため、Cache-object を使用してセッション データをキャッシュしないでください。代わりに、Asp.Netプロファイル プロパティを使用してデータを保存するか、Session_End イベントにイベント ハンドラーを追加して、ユーザーが長時間コンピューターから離れた場合にデータを保存することができます。

于 2009-02-16T12:49:33.733 に答える