21

を使用するTempDataときにモデルを保持するためにを使用していRedirectToActionます。それはうまくいきますが、私はそれが正しいことではないかもしれないというしつこい感じがします。私は本当にSessionデータの使用を避けようとします、そして私はTempDataSessionを使用することを読みました。安全に使用できますか?負荷分散された環境で使用する際に発生する可能性のある問題はありますか?

雑学クイズ:「安全ですか?」-映画に名前を付けます。

4

5 に答える 5

22

はい、TempDataはセッションストレージによってサポートされているため、負荷分散された環境にいる場合は、使用時に特別な注意を払う必要があります(スティッキーセッション、永続セッション状態など)。

TempDataは、PRGパターンを使用する際の事実上の選択であり、そのために設計されたものです。

それが正しいことであるかどうかについては...それはあなたのユースケースに依存します!

PSマラソンマン。

于 2011-11-23T14:18:35.213 に答える
5

まあ、それは状況次第だと私は主張するでしょう。ロードバランサーと複数のフロントエンドサーバーで大量のトラフィックを処理する場合、セッションオブジェクトはパフォーマンスを低下させ、ホットゾーンのスケーリングを困難にする可能性があるため、避けるべきものです(ファーム要求では常に同じWebサーバーに送信されるとは限りません)。

TempDataは短命であり、そこに多くのオブジェクトを配置せず、アーキテクチャ全体についてよく考えれば、安全だと思います。それを広範囲に使用し、問題がないサイトはたくさんあります(私は、セッションを使用する、1日あたり最大5万から7万人の訪問者がいる共有および専用のホストサイトで作業しました。多くの場合、同じサーバー上のWebとデータベースを使用します)。

于 2011-11-23T14:51:56.500 に答える
2

可能な限り、完全にステートレスなアプローチを採用します。よりスケーラブルで、個々のサーバーの問題の影響を受けません。通常、Cookie(改ざんから適切に保護されている)を使用してユーザーを識別し、毎回データベースからデータをプルすることができます。

Viewそれに加えて、の代わりに使用できるかどうかを評価することもお勧めしますRedirectToAction。これ:

TempData["model"] = model;
return RedirectToAction("SomeAction");

次のように置き換えることができます:

return View("SomeAction", model);

もちろん、「SomeAction」が現在のコントローラーからアクセスできる有効なビュー(同じコントロール内のビューまたはSharedで定義されたビューのいずれか)であり、別のコントローラーにリダイレクトする単なる中間アクションではないことを前提としています。

于 2011-11-23T14:33:13.063 に答える
2

セッション状態は、クラスター化された環境で機能します。ただし、次の2つのいずれかが発生します。

  1. ロードバランサーは「スティッキー」セッションをサポートします(つまり、特定のセッション内のすべてのリクエストは同じマシンにルーティングされます)
  2. アウトプロセスセッションプロバイダーを使用するようにセッションプロバイダーを構成します。ASP.NET状態サービスまたはSQLセッション状態プロバイダーのいずれかを使用できます。

tempdataを使用する必要があるかどうかの問題は、まったく別の問題です。私は通常それを回避する方法があると主張します。1つのアクションがすでにロードされているオブジェクトをリロードするためにデータベースへのヒットを回避しようとしている場合は、代わりにキャッシュを使用することを検討してください。

于 2011-11-23T19:35:26.150 に答える
1

ビューとアクションの間でモデルオブジェクト検証メッセージを渡すためのTempDataの使用を制限しました。セキュリティの観点からTempdataの使用法については調べていませんが、次のSOスレッドで同じことについて説明しています:HttpContext.Items withASP.NETMVC 。最後のいくつかのスレッドのコメントと関連する議論を参照してください。

于 2011-11-23T14:23:09.377 に答える