何百ものフィールドがあるフォームを含むページを含むWebアプリケーションがあります。フィールドのいずれかを変更すると、サーバーにjQuery $ .ajaxコールバックが発生し、新しい値に基づいてフォームに他のフィールドを追加する必要があるかどうかを判断します。つまり、1つのフィールドが変更されたときに、依存フィールドをフォームに追加する必要があるかどうかを確認します。
このプロセスには少し複雑さがあり、その結果、これらのチェックに数秒かかる場合があります。
問題は、あるフィールドが$ .ajax呼び出しの途中にあり、最初のフィールドが完了するのを待っている間に別のフィールドを変更しようとすると、UIがブロックされ、ページ上で何もできないということです。最初の呼び出しが完了します。これは、UIが一度に1つの$.ajax呼び出ししか処理できないようなものです。$.ajax呼び出しのコピーは次のとおりです。
$.ajax({
type: "POST",
async: true,
url: serviceUrl,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
processdata: true,
success: serviceSuccess,
error: serviceFailed
});
serviceSuccess
コールバックにはUIを更新するための複雑なコードがたくさんありますが、その中のすべてのコードを削除しても問題は発生します。コールバックが完了する前に発生したように見えるので、コールバックとは何の関係もないと思いましたが、念のために言ってみました。
jQuery $ .ajaxでこのようなことを聞いたことがある人はいますか?
編集: $。ajax呼び出しから返される応答のサイズが約130kであることに気づきました。
編集2: $。ajax呼び出しは、WCFサービスを呼び出しています。クラス定義は次のようになります。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ReviewDataService : IReviewDataService, IReadOnlySessionState
解決策:ジェイソンは間違いなく私を正しい方向に向けました。私の問題は、実際、ASP.NETセッションのロックが原因でした。これを回避するには、WCFサービスから発信された呼び出しで、呼び出しスタックのどこからでもSessionを使用しないようにする必要がありました。さらに、AspNetCompatibilityRequirementsModeをAspNetCompatibilityRequirementsMode.NotAllowedに設定し、web.configのserviceHostingEnvironment要素でaspNetCompatibilityEnabled="false"を設定しました。
これにより、SessionにアクセスしようとしたときにWCFがエラーをスローし、セッションに依存しないように、これらの各インスタンスをリファクタリングしました。その後、私のWCF呼び出しは、同期ではなく同時に実行を開始しました。