2

シナリオは次のとおりです。

  1. ユーザーがクリックして複雑なレポートをダウンロードすると、完了までに時間がかかります (セッション タイムアウトよりも長くなります)。
  2. レポートが完了した後、ユーザーは他のリンクをクリックしますが、セッションは期限切れになります。

ユーザーは、リクエストが長時間実行されている間にセッションが期限切れになった理由を知りたがっています。

リクエスト中にセッションを期限切れにしないようにASP.NETに指示する方法は? (リクエストの完了後にセッションタイムアウトのカウントを開始するため。)

更新:このソリューションは JavaScript がなくても機能するはずです。

4

3 に答える 3

5

Web アプリケーションは、タイムリーに要求に応答する必要があります。実際の問題は、セッションがタイムアウトすることではなく、バックエンドにオフロードする必要があるときに、長時間実行されるプロセスがインラインで発生していることだと私は主張します。

ユーザーにレポートを待たせる代わりに、サーバー上でプロセスを開始してレポートを生成し、ユーザーの要求がキューに入れられて処理中であること、および要求が実行されたときにレポートが準備できることを示す応答でユーザーに応答します。プロセスが完了しました。

その後、ユーザーは引き続き Web サイトをナビゲートしたり、アプリケーションを使用したりできます。レポートが完了したら、さまざまな方法でユーザーに通知できます。アプリケーションは、おそらくレポートを添付して電子メールを送信できます。または、アプリケーション内通知システム (Facebook 通知機能など) が存在する可能性があります。これは、AJAX ポーリング メカニズムを備えているか、(JavaScript を使用しないことに関する更新に応じて) より受動的であり、次の最初のページ要求で通知するだけです。レポートの完成。

いずれにせよ、これほど時間がかかるプロセスは、Web アプリケーションでインライン化するべきではありません。

編集:提案されたセットアップとして、次のことができます:

  1. ユーザーがレポートを要求したら、レポートの生成を開始するために必要な情報を含むレコードをキュー テーブルに追加します。
  2. アプリケーション制御をユーザーに戻します。
  3. キュー テーブルをポーリングし、そのテーブル内のレポートを処理する Windows サービスまたはスケジュールされたコンソール アプリケーションを記述します。
  4. 各レポートが終了したら、表のステータスを更新します。
  5. 必要に応じて、サービス/アプリケーションからユーザーに通知することもできます (電子メール、Web サイトのアプリ内通知システムを駆動するテーブルへのレコードの追加など)。
  6. ユーザーは、通知に従ってレポートをダウンロードするか、Web サイトで「レポート キュー」を確認することができます。
于 2012-09-19T13:35:36.057 に答える
0

レポートの生成中にHttpSessionState.Timeout値を設定することにより、特定のセッションのセッションタイムアウトを手動で延長できます(場合によっては複数回)。

これは少し不格好に思えますが、どれだけ長くするかを常に事前に知ることができ、後で元に戻す必要があります。そうしないと、訪問者になってしまうことになります。タイムアウトが発生していないユーザーとは異なるタイムアウトを持つレポートを生成しました

これは機能するかもしれませんが、これは確かに最善のアプローチではなく、非同期タスクとして実行する必要があります。

于 2012-09-19T13:44:23.827 に答える
0

レポートの生成とファイルのダウンロードのどちらに時間がかかりますか? 操作に時間がかかる場合は、ページ タイムアウトが発生する可能性が高く、メソッドの応答に時間がかかりすぎています。

ユーザーから要求されたファイルのダウンロードに時間がかかるためにセッションが期限切れになった場合、これは正常な動作です。ユーザーがファイルをリクエストすると、次のリクエストまでアクティブでないように見え、セッションが更新されず、期限切れになります。

于 2012-09-19T13:37:38.297 に答える