1

私の webapp には、コード ビハインドから生成され、リピーター コントロールにバインドされたリンクのリストがあります。リンクをクリックすると、ポップアップ ウィンドウが開き、いくつかのデータが表示されるとともに、WCF サービスへの非同期呼び出しが (JavaScript プロキシ経由で) 行われます。このサービスは、応答に時間がかかる可能性がある別のサード パーティの Web サービスを呼び出します。私はIE6で作業しています。これは避けられない要件です。

ここで、ユーザーが呼び出しの完了を待たずにポップアップ ウィンドウを閉じた場合、onunload でこのサービスを中止します。問題は、ユーザーが直後にリピーターから別のリンクをクリックすると、新しいポップアップウィンドウが開きますが、前の非同期呼び出しが完了するまでページをロードしない (提供された URL に移動しない) ことです (私はこれを確認しました)。フィドラー経由)。興味深いことに、これは同じドメイン内のリンクに対してのみ発生します。ポパスの 1 つのリンクをたとえば www.google.com に変更すると、ウィンドウが開き、意図したとおりの正しい URL に移動します。ただし、自分のドメイン内のリンクを含むポップアップの場合、未完了のリクエストを含むポップアップ ウィンドウが閉じられた直後に開かれ、URL をロードする前に前のリクエストが完了するまで待機します。

コールバックを中止する正しい方法を確認しましたが、中止は適切に実行されます。また、サーバー側の呼び出しではなく、クライアント側の呼び出しのみを中止できることも知っており、気にしません。私の唯一の要件は、前の非同期応答に関係なく、ブラウザが次のリンクをロードすることです。

//Method to Call Service:

    function GetData(Id) {

            //call the service

            Sys.Net.WebRequestManager.add_invokingRequest(On_InvokingRequest);

            var service = new WrapperService();
            service.GetData(Id, handleSuccess, handleError, null);

            Sys.Net.WebRequestManager.remove_invokingRequest(On_InvokingRequest);
        }

//method to get the current requests abort executor
function On_InvokingRequest(executor, eventArgs) {
        var currentRequest = eventArgs.get_webRequest();
        abortExecutor = currentRequest.get_executor();
    }

//abort service on unload
function unload() {
        if (abortExecutor != null) {
            abortExecutor.abort();
        }
    }

背景に関する役立つ/類似のリンク:

browser-waits-for-ajax-call-to-complete-even-after-abort-has-been-call-jquery aborting-an-asp-net-web-service-asynchronous-call canceling-ajax-web-service-電話

誰もこれに直面しましたか?それは私を夢中にさせます!どんな助けでも大歓迎です。

4

1 に答える 1

0

あなたのリンクの1つの答えは、私にとっては問題のように聞こえます: ブラウザは、中止が呼び出された後でもajax呼び出しが完了するのを待ちます(jQuery)

あなたのサービスはセッション状態を必要としますか?

同じドメインへの 2 つ以上の要求を許可するように IE を構成することにより、問題が IE 自体が要求を発行しないことであるかどうかを証明できます。中止されたリクエストが何らかの形でこれらの接続の 1 つを消費しているためにブロックされている場合は、それを増やすと異なる結果が得られるはずです。それでも問題が解決しない場合は、サーバーが応答を待っている可能性があります。

2 つ以上のリクエスト用に IE を構成します: http://support.microsoft.com/kb/282402

リンクした SO の質問の 1 つからの引用:

これがブラウザの問題であることについて、私は完全に間違っていたことが判明しました。問題はサーバーにありました。ASP.NET は、セッション状態を必要とする同じセッションの要求をシリアル化するため、この場合、これらの ajax によって開始された要求が完了するまで、次のページはサーバーで処理を開始しませんでした。

残念ながら、この場合、ajax 呼び出しに応答した http ハンドラーでセッション状態が必要になります。ただし、読み取り専用アクセスで十分なので、ハンドラーを IRequiresSessionState ではなく IReadOnlySessionState でマークすることにより、セッション ロックが保持されず、問題が修正されます。

于 2009-07-21T06:30:03.223 に答える