16

TempData を使用する場合、私の理解では、1 回の要求に対してのみ入力した内容が保持されます。したがって、(Post-Request-Get パターンを使用するために) リダイレクト全体でデータを保持するために TempData を使用する場合、リダイレクトを送信する応答とリダイレクト先のページを要求しているユーザーのブラウザ? その場合、get で TempData が使用できなくなりますよね?

今、そのようなことが起こることは非常にまれであることを理解していますが、ユーザーが別のタブで別のページを開いている可能性があり、そのページで ajax または時限コールバック要求が発生している可能性があることを考慮すると、突然発生しません私にはまったく不可能に思えます。一般的に、遠すぎて心配できないと考えられているのでしょうか、それとも私が何か誤解しているのでしょうか?

編集:私が尋ねていたシナリオについてより具体的にするために。

  1. タブ 1 で、ユーザーは投稿フォームのあるページを参照します
  2. タブ 2 では、タイマーで ajax コールバックを実行するサイトの別のページにユーザーがブラウザーでアクセスします。
  3. タブ 1 では、ユーザーがフォームをサーバーに投稿します。
  4. サーバーが投稿を受信すると、TempData にデータを保存し、リダイレクト応答を返します。
  5. タブ 2 では、時間指定された ajax コールバックが発生し、サーバーに GET リクエストが送信されます。TempData がセッションから削除されます
  6. タブ 1 では、ブラウザーがリダイレクトを受け取り、GET 要求を発行します。
  7. サーバーは GET 要求を処理し、TempData を探しますが、もうありません。
4

4 に答える 4

9

さて、ASP.NET MVC コードを参照すると、TempData がセッションに保存されている間、読み込まれるとセッションから削除されることがわかります。そして、コントローラーの ExecuteCore() メソッドにロードされます。

つまり、そうです、別のブラウザタブからのリクエスト(かなり良い例がありました)がこの問題を引き起こす可能性がある競合状態に完全に遭遇する可能性があることを意味すると思います. ただし、それはリクエストを処理するための各ブラウザーのモデルに依存します。ブラウザーは、一度に 1 つのみが実行されるように、同じサーバーへのすべての要求をシリアル化する場合があります。実際には、彼らはそれをしませんが、同じサーバーへの同時リクエストが(私は思うに)最大5つに制限します。

あなたが言ったように、ASP.NET MVCサイトが任意のブラウザへのサービスリクエストである可能性があることを考えると(それはWebです.

于 2008-10-25T02:31:02.027 に答える
4

TempData の使用時に競合状態が発生する可能性は十分にあります。ただし、通常の使用でそれを体験するには、もちろん「運が悪い」必要があります。競合状態に陥るには、次の条件がすべて満たされている必要があります。

  1. まず、TempData を使用する必要があります。
  2. 複数のブラウザー ウィンドウ/タブ/何でも開いて、同じブラウザー セッションを共有する必要があります。
  3. 2 番目のブラウザー タブからの要求は、最初のブラウザー タブの要求と応答の間に「忍び込む」必要があります。

項目 2 は、使用しているブラウザに大きく依存することに注意してください。IE の設定方法によっては、複数のウィンドウを開いているからといって、ブラウザーの Cookie を共有しているとは限らず、セッション (Cookie に基づく) を必ずしも共有するとは限りません。

ただし、何かに遭遇した場合に何かが爆発するという意味での競合状態はありません。それがHaackedが言及していることかもしれません。ただし、あるリクエストでいくつかの TempData を設定し、次のリクエストでそれを取得すると思っていた場所に戻らなかったという意味で、競合状態に陥る可能性があります。空になるだけです。

ありがとう、エイロン

于 2008-10-27T00:43:23.343 に答える
0

最初は同じ混乱がありましたが、決して起こらないと思います.mvc Webアプリケーションをデバッグモードで実行すると、リダイレクトアクションにブレークポイントを設定し、tempdataに値を指定すると考えてください.リダイレクト viewResult と他のビューで tempdate を取得すると、リダイレクト アクションが完了するまで、他の要求が応答されないことがわかります。一度に1つのリクエスト。したがって、上記のシナリオは決して起こり得ません。

于 2009-08-06T07:25:37.983 に答える
0

TempData は、この問題に悩まされていない Session オブジェクトを利用しています。これで特定の問題に遭遇しましたか?

于 2008-10-25T00:42:06.723 に答える