2009-07-20 31 views
1

在我的web應用程序中,我有一個從代碼隱藏生成並綁定到中繼控件的鏈接列表。點擊一個鏈接將打開一個彈出窗口,其中顯示一些數據,並通過一個JavaScript代理進行對WCF服務的異步調用。該服務又會調用另一個可能需要很長時間才能響應的第三方Web服務。我正在使用IE6,這是一個不可避免的要求。中止異步Web服務調用並重定向到另一個URL(ASP.NET Ajax)

現在,如果用戶決定不等待呼叫完成並關閉彈出窗口,則在onunload上放棄此服務。問題是,如果用戶立即從轉發器中單擊另一個鏈接,新的彈出窗口將打開,但不會加載頁面(不會轉到提供的URL),直到上一個異步調用完成(我已驗證了此操作通過提琴手)。有趣的是,這隻發生在同一個域內的鏈接上。如果我將某個popus的鏈接更改爲www.google.com,則該窗口會打開並按照預期轉到正確的網址。但是,對於在我自己的域中有彈出窗口的彈出窗口,在關閉具有未完成的請求的彈出窗口之後立即打開它,它會在加載該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-called-jquery aborting-an-asp-net-web-service-asynchronous-call canceling-ajax-web-service-call

任何人之前遇到過嗎?它讓我瘋狂!任何幫助將不勝感激。

+0

當你說後面的彈出窗口「等待」上一個請求完成時,你的意思是瀏覽器掛起了嗎? IE可以在瀏覽器Chrome瀏覽器與「等待」(拖動窗口,關閉它等)之間進行交互嗎? – 2009-07-21 01:54:45

回答

0

在鏈接中的一個答案聽起來像這個問題對我說: Browser waits for ajax call to complete even after abort has been called (jQuery)

請問您需要服務的會話狀態?

您可以證明問題是否IE本身不會通過配置IE來發出請求,以允許對同一個域的超過2個請求。如果由於中止的請求以某種方式消除了其中一個連接而被阻止,那麼增加它會產生不同的結果。如果問題仍然存在,則必須等待服務器等待響應。

配置IE超過2個請求:從你鏈接的SO問題之一 http://support.microsoft.com/kb/282402

報價:

事實證明我完全錯了這是一個瀏覽器的問題 - 問題在服務器上。 ASP.NET將需要會話狀態的同一會話的請求序列化,因此在這種情況下,下一個頁面在服務器上纔開始處理,直到完成這些由ajax發起的請求。

不幸的是,在這種情況下,在響應ajax調用的http處理程序中需要會話狀態。但只讀訪問是足夠好的,所以通過使用IReadOnlySessionState而不是IRequiresSessionState標記處理程序,會話鎖定不會被保留,問題就解決了。