2009-05-13 5 views
1

を要求...ASP.NET MVC + jQueryの+ IIS6:複数のAjaxが、私は、問題がどこにあるかわからない

私はリストにページ上のパッケージの追跡情報をチェックするAJAX要求を持っています

ページに10個のパッケージ(10個のクラス 'fedex_status')がある場合、10個のリクエストが作成されます。要求は正常に動作しますが、結果は一度に1つずつ(シリアル形式で)返されます。コントローラのアクション内でリクエストの開始と停止にタイムスタンプを追加しました。

public ActionResult Fedex(string trackingNumber) 
    { 
     DateTime requestStart = DateTime.Now; 

     TrackingService tracking = new TrackingService(); 

     string status = tracking.FedexTrackingNumberStatus(trackingNumber); 

     return Content(status + " - " + requestStart.ToString("hh:mm:ss.FFF") + " - " + DateTime.Now.ToString("hh:mm:ss.FFF")); 
    } 

タイムスタンプのどれも重複していません。したがって、コントローラは要求を1つずつ処理しています。これはおかしなことです。

ここで、ajaxリクエストは '必須'です。それは間違いなく即座に(非同期に)戻ります。 IISのログを見ると、要求にはコントローラアクションが返すものと同じタイムスタンプがあります。

私の質問は、jqueryがすべてのajaxリクエストを並列に送信しないこと、またはIISまたはASP.NETのみがリクエストをシリアルに処理していることです。私はIISとASP.NETの技術的な詳細を大事にしているので、おそらくその設定が永久に間違っていて、一度に1つの要求にしか応答しません(内部使用、低トラフィック)。つまり、私はjqueryのばかだと、リクエストが実際に実行されたときにテストする方法がわからない(私が知っているのは$ .ajaxコールがすぐに返るということだ)。

ありがとうございます!

答えて

4

理論上、セッション状態を有効にしたASP.NETは、各ユーザーの要求に対してセッションをロックし、したがってセッションを順次処理します。 TempDataはデフォルトでセッションを使用するため、MVCプロジェクトのSessionを無駄に無効にすることはできません。しかし、あなたは試すことができます。

編集:ここに私のマシン上で期待通りrelated question

+0

これは残念です。私は実際には他の場所(ユーザーが「作成した貨物」のようなメッセージ)で一時的なデータを使用していますので、それを取り除くことはできません。この特定のコントローラーはTempDataやSessionを必要としません。私はコントローラのレベルでTempDataを無効にすることが役立つかどうか、またはコントローラがそれを使用するかどうかにかかわらずweb.configのトランプでセッションが無効になっていないかどうか疑問に思う。 – anonymous

+0

私はそれが状況のサブセット(aspcompt = trueが頭に浮かぶ)にのみ当てはまると考えました。私は、セッションだけでは、すべてのリクエストがシリアライズされるとは思わない。 –

+2

@Erv:この回答から、私が読んできたことは、標準のASP.NETでは、ページごとにセッションで必要なロックの種類を指定できるということです。デフォルトでは、私はそのライターのロックと考えているだけ1ページあたり1要求を許可します。複数のリーダーを許可するリーダーロックに変更できますが、ライターをブロックし、ロックを保持しているライターをブロックします。これをASP.NET MVCに適用する方法を知りません。私は何も特別なもののためにセッション状態を使用するので、「どこでもリーダーロックを使用する」と言いたいです。 – anonymous

0

クラスが.fedex_statusの要素を見つけるたびに、あなたはajaxリクエストを呼び出しています。

あなたのライン

$( "fedex_status")。各

を使用すると、クラス.fedex_statusを持つ要素を見つけるこれ毎回やると言っています。

+0

うん、それはアイデアだ。だから私がfedex_statusのための10の一致を持っているならば、私は10のajaxリクエストを並行して呼び出し、それぞれが非同期に戻るようにしたい。現在、それらは連続して実行されています(実際には同期的ではありませんが...要求は即座に返されるため、非同期ですが、要求は順次処理されます)。私は、クライアント側またはサーバー側が、パラレルではなくシリアルであるかどうかは分かりません。 – anonymous

+0

リクエストは並行して実行されません。 JSONに関する情報はあまりよくわかりませんが、1つのajaxリクエストでJSONの情報を返し、jsonをループしてdomにデータを挿入できます。確かにアイデアは分かりません。 –

+0

一度に飛行することができるのは1回だけです。 – anonymous

1

あなたのコードが動作するのです。私はThread.Sleepで任意の人為的な遅延を挿入しなければなりませんでした。純粋な要求が非常に速く実行されたため、一度にすべて完了したように見えました。

System.Threading.Thread.Sleep(1000); 

return Content(String.Format("Thread #{0}, Started = {1:hh:mm:ss.FFF}, Completed = {2:hh:mm:ss.FFF}, Duration = {3:hh:mm:ss.FFF}, Result = {4}", 
     System.Threading.Thread.CurrentThread.ManagedThreadId, 
     requestStart, 
     DateTime.Now, 
     DateTime.Now.Subtract(requestStart), 
     status)); 

Firefoxを使用して、私のマシン上で簡単にテストおよびビルトインのVisual StudioのWebサーバーに接続するには、2つの要求は、クライアント上で同時に実行し、サーバー上の2つの異なるスレッドによって処理されたことを示しました。

私が知る限り、ブラウザによって許可されている許可された同時リクエストは限られています。あなたのポストを再読し、あなたがIIS 6に言及していることを見ました。私はIIS 6にアクセスできないが、実行しています。それは5秒の人工タイムアウト(スレッド。Sleep)は、複数の要求が異なるサーバースレッドによって同時に処理されていることを示しました。どちらもEXACTで同時に起動しないので、サーバで待ち行列が行われているかもしれませんが、5秒遅れてFirefox 3.0では一度に6つ以上の同時リクエストがあることがわかります。

+0

私はこれ以上いくつかの周りを再生する必要があります。私のASP.NET MVC実装のアクションコードはASP.NET WebFormsコード(WebFormsのクエリ文字列の解析以外)と同じです。それ以外の唯一の違いは、WebFormsのセッションを無効にする変更でした。私は何らかのロックのためにASP.NET MVCよりWebFormsのパフォーマンスが向上しています。 ASP.NET MVCから同時に2つのリクエストを取得している場合は、さらに詳しく調べる必要があります。ありがとう! – anonymous

+0

複数の呼び出しではなく、すべての追跡番号で単一の要求を行い、返されたデータを解析してUIを更新したくないという理由がありますか? – GuyIncognito

+0

いくつか、特にこれは簡単です。しかし、それを無視しても、私が追跡番号の配列を要求した場合、私はそれらをサーバーレベルで連続して実行しなければならないか、スレッドの束を生成したり、サービスを非同期にする必要があります。私がhttpとウェブサーバーを持っているときに、どうしてそんなに面倒を見るのか。一般的なケースでは(トラッキング情報ではありません)、私はajaxを介してすべての読み込みを行うigoogleウィジェットのようなものを探索したいと思います。だからあなたはポータルホームを持っていて、ページをロードするためのajaxコールがたくさんあります。 – anonymous

関連する問題