8

環境:

  • Windows Server 2003-IIS 6.x
  • ASP.NET 3.5(C#)
  • IE 7,8,9
  • FF(最新の10バージョンが何であれ)

ユーザーシナリオ:

ユーザーは、大規模なデータセットに対して検索条件を入力します。リクエストを開始すると、結果ページに移動し、データが読み込まれるまで待機してから、データを絞り込むことができます。

技術シナリオ:

ユーザーが(ajax呼び出しを介して)検索条件を送信した後、UIはバックエンドサービスを呼び出します。バックエンドサービスはトランザクションシステムにクエリを実行し、結果のデータをデータベースの「キャッシュ」に配置します。これは非正規化されたテーブルであり、データをさらに絞り込むために設定されます(つまり、並べ替え、フィルタリング)。UIは、データがキャッシュされるまで待機し、プロセスが完了したことを通知されると、結果のページに移動します。次に、結果のページは、非正規化されたテーブルからデータを取得するための呼び出しを行います。

問題:

入力された基準に基づいて多くのシステムにクエリを実行する必要がある大規模なクエリの検索は、比較的低速(15〜25秒)です。他のクエリでは比較的高速です(<4秒)。

技術的な制約:

  1. この検索/結果システムを完全に再構築することはできません。ここでは、UIとバックエンドを結び付ける方法の間に多くの複雑さへの道があります。検索条件を実行した後、ページをめくる必要があります(StackOverflowでは解決できない制約のため)。

  2. また、データはリアルタイムである必要があるため、検索前にデータを非正規化するように組織に依頼することはできません。つまり、ユーザーが他のシステムに変更を加えた場合、後で検索を行うとデータが正しく表示される必要があります。

私が従いたいプロセス:

  1. 少しごまかしたいです。fire-forgetモデルの非同期HttpHandlerを介して「Cache」リクエストを発行したいと思います。

  2. クエリを発行した後、ページを結果のページに移行したいと思います。

  3. 遷移ページで、「キャッシュ」テーブルをポーリングして、データがまだ挿入されているかどうかを確認したいと思います。

  4. この移行をすぐに実行したい理由は、結果のページ自体が(データを取得しなくても)コストがかかるためです。キャッシュからデータを取得するサービスを呼び出す前に、ロード時間は2秒です。

質問:

javascriptリダイレクトを使用してページから移動した場合でも、非同期ハンドラーを介して呼び出されたASP.NETスレッドは確実に処理を続行しますか?

技術的境界2:

はい、わかっています...この検索プロセスは効率的ではありません。今はそれについて私にできることは何もありません。私は、それをどのように再構築するかを研究し続けている間、それを少し良くするためにできることは何でもしようとしています。

あなたの答えが「それを捨てて最初からやり直す」であるならば、答えないでください。それは受け入れられません。

4

3 に答える 3

4

はい。

長時間実行されているプロセスがまだ接続されているかどうかを知るために使用されるプロパティ Response.IsClientConnected があります。このプロパティの理由は、クライアントが切断されてもプロセスが実行を継続し、プロパティを介して手動で検出し、早期切断が発生した場合は手動でシャットダウンする必要があるためです。デフォルトでは、クライアントの切断時に実行中のプロセスを中断することはありません。

このプロパティへの参照: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx

アップデート

参考までに、これは最近のソケットで頼りにするのは非常に悪いプロパティです。データベースまたは実行時間の長いタスクのキューに記録するリクエストをすばやく完了できるようにするアプローチを強くお勧めします。おそらくRabbitMQなどを使用し、socket.ioなどを使用して更新します完成したウェブページまたはアプリ。

于 2013-02-11T03:47:20.300 に答える
3

ASP.NET スレッドで非同期操作をまったく行わないのはどうですか? ASP.NET コードでサービスを呼び出してデータ検索をキューに入れ、サービスからのトークンを使用してブラウザーに戻り、完了した結果を待つ結果ページにリダイレクトしますか? 結果ページは、サービスからのトークンを使用してポーリングします。

そうすれば、ブラウザーが別のページに移動したことを ASP.NET が学習するかどうかを心配する必要がなくなります。

于 2013-02-11T02:10:35.130 に答える
0

もう 1 つのオプションは、スレッド ( System.Threading) を使用することです。
ユーザーが検索条件を送信すると、サーバーはページ要求の処理を開始し、検索の実行を担当する新しいスレッドを作成し、応答を終了してブラウザーに戻し、結果ページにリダイレクトします。その間、スレッドはサーバー上で実行を続けます。バックグラウンド。
結果ページは、開始されたスレッドが進行状況情報を共有するため、クエリの実行が終了したかどうかをサーバー上で確認し続けます。終了すると、次の ajax 呼び出しが結果ページによって行われたときに結果が返されます。

WebSocket を使用することも考えられます。ある意味では、Web サーバー自体は、全二重通信チャネルを提供するため、クエリ実行の処理が完了したときにブラウザーに通知できます。

于 2013-02-11T02:30:11.680 に答える