1

私には解決しなければならない興味深い問題があり、どこから始めればよいのかさえわかりません。フォームを介してレコードのリストを取得し、それぞれに対してajax呼び出しを行うMVCWebアプリケーションを作成しています。ajax呼び出しがヒットするコントローラーは、一度に1つのリクエストしか処理できないリソースを使用します。簡単な解決策は、ajax呼び出しを同期に変更することですが、ブラウザーがハングし、エクスペリエンスが低下します。

また、複数のユーザーがこのアプリを同時に使用する可能性があるため、クライアント側でのキューイングは機能しません。

誰か提案がありますか?

マイク

4

1 に答える 1

0

まず最初に、私の要件はあなたの要件とまったく同じではありません。私の問題は、バックエンドデータベースが少し遅くなる傾向があり、ユーザーの応答性が非常に重要であるということでした。

したがって、方程式からデータベースの相互作用を削除する必要がありました。

私のソリューションには2つの主要な部分があります。

  1. データのサーバー側キャッシュを維持する

  2. サーバーと対話できるすべてのデータベース作業を含む別のプロセスを作成します

別のプロセスは、Windowsサービスによってホストされる名前付きパイプWCFサービスとして実装されました。

基本的なプロセスの概要は次のとおりです。

  1. ユーザーが[保存]をクリックすると、AjaxがフォームをMvcコントローラーに投稿します
  2. コントローラはキャッシュデータを更新してから、WCFパイプを呼び出します
  3. サービスはデータを(セッションIDとともに)同時キューにプッシュし、GUIDトークンを返します
  4. コントローラーはトークンをJSON応答として返します。
  5. jQuery Ajaxハンドラーは応答をインターセプトし、トークンを6.「保存済み」フォームを表すUI要素に保存します。

サービス自体は次のように機能します。

  1. 開始時にタイマーを作成します。
  2. タイマーティック:
  3. タイマーを停止します。
  4. キューに入れられたすべての作業項目を並行キューから削除します
  5. ワークプロセッサで処理する各アイテムを送信します
  6. 以前のセッションIDでキー設定された「完了」または「エラーあり」の同時辞書にアイテムを追加します(古いデータを排除するために時間を確保します)。これには、元の作業トークンが含まれます。
  7. タイマーを再開します。

ユーザーランドに戻ると、javascriptsetIntervalループが実行されています。

  1. サーバー(ハートビートコントローラー)へのAjaxリクエスト
  2. コントローラはサービスに接続し、現在のセッションIDを渡します
  3. このサービスは、「完了」および「エラー」辞書からすべてのアイテムを返します
  4. コントローラはリストをJSONオブジェクト配列として返します
  5. javascriptは返されたリストをループし、トークンを使用して適切なUI更新を行います

最終的には、バックエンドの永続性サーバーが遅いにもかかわらず、非常に応答性の高いUIになります。

実装コードの特定の部分が必要な場合は、私に知らせてください。

于 2012-09-06T18:09:38.957 に答える