可能性のある“競合状態”リダイレクトでAsp.Net MVC TempDataを使用する場合

StackOverflow https://stackoverflow.com/questions/235665

質問

TempDataを使用するとき、私の理解では、1回のリクエストだけで何を入れても保持されます。したがって、TempDataを使用してリダイレクト後のデータを保持する場合(Post-Request-Getパターンを使用するため)、ユーザーからのその他のリクエストがリダイレクトを送信する応答とサーバーの間に送信される可能性はありませんユーザーのブラウザがリダイレクト先のページをリクエストしていますか?どちらの場合、getでTempDataが利用できなくなりますか?

今、私はそのようなことが非常にまれであることを理解していますが、ユーザーが別のタブで別のページを開いている可能性があり、そのページでajaxまたはタイミングコールバックリクエストが発生する可能性があることを考慮して、私にはそんなに不可能ではないようです。それは一般に、心配するには遠すぎると考えられていますか、それとも何かを誤解していますか?

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

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

解決

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

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

ASP.NET MVCサイトが任意のブラウザーへのサービスリクエストになる可能性があることを考えると(それはWebです。結局):)、あなたが言ったように、おそらくまれではありますが、実際のシナリオです。

他のヒント

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

  1. 最初にTempDataを使用する必要があります。
  2. 複数のブラウザウィンドウ/タブ/何でも開いて同じブラウザセッションを共有する必要があります。
  3. 2番目のブラウザタブからのリクエストは、「忍び寄る」必要があります。最初のブラウザタブのリクエストとレスポンスの間。

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

ただし、実行すると何かが爆発するという意味での競合状態はありません。それがHaackedが言及していることかもしれません。ただし、1つの要求でTempDataを設定し、次に考えていた次の要求でそれを取得しなかったという意味で、競合状態に陥る可能性があります それを得るために。空になります。

ありがとう、 エイロン

TempDataはSessionオブジェクトを使用しますが、このオブジェクトはこの問題の影響を受けません。これで特定の問題が発生しましたか?

最初は同じ混乱がありますが、デバッグモードでmvc Webアプリケーションを実行する場合、リダイレクトアクションでブレークポイントを設定すると考えてください。値、リダイレクトビューの結果および他のビューでtempdateを取得します、リダイレクトアクションが完了するまで、他の要求が応答されないことがわかります。だからどういう意味ですか?一度に単一のリクエストを処理できるため、上記のシナリオは決して発生しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top