データベース内のファイルを更新または追加する aspx Web アプリケーションがあります。クライアントはブラウザーを介してアクセスします。要件の 1 つは、クライアントが更新を開始し、更新中にブラウザーを閉じることができることです。ブラウザを閉じた後、少し実行されているように見えますが、その後停止します。どうすれば asp.net でアプリケーションを実行し続けることができますか?
5 に答える
これは、 WF (Workflow Foundation)を使用して非常にうまく解決できるものです。ブラウザーを閉じても存続するタスクのワークフローを作成します。ワークフローには、ASP.NET とは別の独自のスレッドとライブサイクルがあります。
Web アプリケーションはアプリケーション プールで実行され続けますが、これは最終的にリサイクルされます。ユーザー セッションが実行されている限り、アプリケーションは存続する必要があるため、セッション タイムアウトを増やすことで問題を解決できる場合があります。
代わりに長時間実行されるタスクをサービスに移動することをお勧めしますが、それにはアプリケーションの書き直しが必要になる場合があります。
通常、長時間実行または非同期処理の場合、リクエストをバックエンド サービスにディスパッチして処理します。処理を完了するために Web アプリを維持しようとすると、特に HTTP とセッションのタイムアウトで問題が発生する可能性があります。
これの一般的なパターンは、要求をメッセージ キューに入れ、可能な場合はバックエンド サービスに処理させることです。
Webアプリケーションからジョブをプッシュできる別のWindowsサービスを作成し、ユーザーが再度ログインしたときにジョブのステータスを確認します。
Windows サービスは asp.net アプリ ドメインに関連付けられないため、Web アプリケーションで何が起こっても引き続き実行されます。
私はこのパターンに遭遇したため、作業を HTTP 要求から分離する必要があります。私たちがこれを解決した方法は、実行されるコンピューティングを、スケジュールされるイベントとして抽象化することです。したがって、ブラウザーのユーザーが、バックエンドで (比較的) 長時間実行される計算を必要とするアクションを実行するとします。この計算には、「doXYZForUser」のような名前が付けられ、(userId, params...) のようなパラメーター ベクトルが付けられます。ワーク キューに送信されます。将来のある時点で、ユーザーは再びログインし、ジョブのステータスを確認できます。
Java スタックと Java Message Service (JMS) を実行していますが、原則は同じです。ブラウザーからの要求はイベントをキューに入れ、ブラウザーはイベントが作業キューにあることを示す ACK を返します。キューは、完全に個別に実行されているプロセスによって管理されます。これは、.NET ではメッセージ キューと呼ばれているだけだと思います。ジョブは処理されるキューに表示され、ジョブを開始したユーザーへの参照を含む別のテーブルに結果を配置できるため、次回ログインしたときにジョブのステータス/結果を返すことができます。