2010-06-09 78 views
1

這裏致人死亡(WSOD)的白色屏幕的規格:Web Service調用在JavaScript在瀏覽器

  • ASP.NET 3.5使用ASP.NET AJAX
  • AJAX控件工具包
  • 的jQuery 1.3.2
  • Web服務
  • IIS6在Windows Server 2003 SP1
  • SP1的SQLServer 2005 SP3網站是SSL
  • Infragistics Web Components 2009 Vol。 2(使用非合氣道控件),UltraWebGrid和樹控件是主要使用的。

這裏是問題: 我在IE 7/8中遇到了白屏死機(WSOD)。基本上,我有一個頁面,左側窗格中有一個AJAXControl Toolkit Accordion控件,其中每個手風琴窗格內容都是Infragistics樹控件。右窗格是一個<div>,它具有,其內容根據左側菜單窗格中單擊的內容重新加載。

在中,當您單擊左窗格中的菜單項時,包含一個或多個UltraWebGrid控件的頁面將加載。網格都有一個模板按鈕列。當您單擊網格行的編輯按鈕時,會打開一個彈出窗口來編輯記錄。這可以正常工作十次左右,然後在第十次(有時候更早)時,彈出窗口將在地址欄中打開並顯示正確的URL,但頁面不會加載。

我們有一個應用程序使用一個彈出窗口來更新記錄。大多數情況下,當您單擊[編輯]按鈕編輯記錄時,彈出窗口將打開並加載更新頁面。但是,在編輯了一段時間的記錄之後,突然間彈出窗口會打開,但它保持空白並且只是掛起。該網址位於地址欄中。

加載Fiddler我注意到,更新頁面的請求從未被髮送,這導致我相信它是在客戶端的某種鎖定。如果我將彈出窗口中的相同URL複製到新的瀏覽器窗口中,該頁面通常可以正常加載。

觀察: - 由於請求永遠不會發送到服務器,所以肯定是客戶端或瀏覽器相關的東西。 - 只有在網站上出現某些流量類似情況時纔會出現,這很奇怪,因爲這似乎包含在客戶端代碼中 - 每隔幾秒在後臺調用一次Web服務,檢查用戶是否登錄,但這不會導致凍結。

我真的很茫然。我搜索了WSOD,但似乎並沒有多少與我的特定WSOD相關。有任何想法嗎?

的問題到底是什麼

所以原來的內存泄漏(雖然我已經查封了一些關於客戶端)都沒有問題。問題是Web服務調用是在客戶端進行的。有一個檢查用戶是否每4秒鐘登錄一次(與另一個窗口同步),然後有Web服務調用來獲取彈出窗口和網格狀態的用戶首選項。從我讀過的內容來看,Web服務必須是異步的。我假定通過成功/失敗回調從JavaScript調用他們,他們是異步的,但他們真的不是。他們是從視客戶端/瀏覽器點同步,但是從服務器端,Web服務調用是由返回,當它完成高舉任何其他操作,因爲有連接的數量有限。

那麼什麼是隻是使Web服務方法異步的最簡單的方法? Web服務是否需要轉換爲WCF Web服務,還是可以使用現有的ASP.NET Web服務調用?

而對歷史的目的,這就是我認爲這個問題本來是:

我無法重現這個本地或在我們的測試服務器。但是,我得到了Fiddler來模擬調制解調器速度,突然之間我可以在本地PC上覆制WSOD。所以當打開一個導致它窒息的彈出窗口時,至少在我的測試環境中,它似乎是一個緩慢或暫時緩慢的連接。

我做了另一個測試運行IE瀏覽器沒有插件,iexplore.exe -extoff,但具有相同的結果結束。我還修復了每當iframe的URL更改時都會重新創建頁面上的iframe的問題。我的一部分邏輯被省略了。現在iframe只創建一次。在此之後,當我想加載新的內容......我混日子只有src屬性被更新。我注意到在JavaScript關閉一些揮之不去的窗口引用,所以現在這些都明確地設置爲空在關閉時,我要和他們一起做。

我也做了一些內存泄漏調查: - 據我可以告訴我沒有在DOM和JavaScript或這裏提到的其它泄漏模式中的任何循環引用,http://www.ibm.com/developerworks/web/library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa

  • 我已經添加了Crockenator的吹掃代碼IE內存泄漏(見http://www.crockford.com/javascript/memory/leak.html):

    $(文件)。就緒(函數(){ 函數吹掃(d){ VAR一個= d.attributes,I,L中,n;

    if (a) { 
         l = a.length; 
    
         for (i = 0; i < l; i += 1) { 
          if (a[i]) { 
           n = a[i].name; 
    
           if (typeof d[n] === 'function') { 
            d[n] = null; 
            purgeCount++; 
           } 
          } 
         } 
        } 
    
        a = d.childNodes; 
    
        if (a) { 
         l = a.length; 
         for (i = 0; i < l; i += 1) { 
          purge(d.childNodes[i]); 
         } 
        }   
    }   
    
    $(window).unload(function() { 
        purge(document.body); 
        //alert("purge count: " + purgeCount); 
    }); 
    

    });

我的任何改進都沒有解決問題。在我的本地測試場景中。有任何想法嗎?任何人?任何人? Bueller?

最後更新

感謝大衛指出,這是造成網絡服務的問題,會話狀態。 「」ASP.NET將所有請求排隊到同一個'會話',所以如果第一個請求阻塞時間過長,它將阻止任何其他排隊的請求。「

所以我們最後做了嘗試使用會話狀態,以儘量減少網絡服務,但我們也通過微軟補充建議設置連接數,看http://msdn.microsoft.com/en-us/library/ff647786.aspx#scalenetchapt10_topic9

回答

0

我想你可能有與問題會話請求同步。您是否將Web服務處理程序標記爲需要會話狀態?

ASP.NET將所有請求排隊到同一個「會話」。所以如果第一個請求阻塞時間過長,它會阻塞其他排隊的請求。您可以關閉頁面的會話狀態以避免這種情況,並且確實是異步的,但是您將無法訪問服務器上的會話等。

如果您使用.ashx,則必須使用接口來獲取訪問會話狀態,默認是關閉的,所以請檢查您是否添加了這些接口中的一個,並刪除可能的話:

public class FooHandler : IHttpHandler, IReadOnlySessionState // readonly access 

public class FooHandler : IHttpHandler, IRequiresSessionState // read-write access 

如果您使用的是aspx頁面,它在默認情況下,你必須把它使用Page指令屬性關閉:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" 
AutoEventWireup="false" Inherits="WebApplication1.WebForm1" 
EnableSessionState="false" %> 
+0

導致問題的Web服務方法e使用會話狀態,即[WebMethod(EnableSession = true)]。在服務中訪問會話比通過[WebMethod(EnableSession = true)]有更好的方式嗎?我運行的Web服務需要知道用戶的會話,並從JavaScript中調用。 – nickytonline 2010-06-15 15:01:09

+0

不幸的是,ASP.NET強制會話的請求同步,你必須實現一些其他形式的交叉請求狀態存儲,並讓你的webmethods禁用會話狀態。會話狀態的請求同步是爲什麼你不必「鎖定」從會話中獲取/設置。如果將存儲移動到Application []中的用戶特定散列,則不會請求同步,但訪問該數據時需要Application.Lock()和Application.Unlock()。 – David 2010-06-15 19:06:44

+0

你是否需要寫入會話狀態?如果您將它們更改爲只讀,它們將不會彼此阻塞,但是它們仍然會被任何其他頁面阻塞,從而在會話上獲得寫入鎖定。請參閱http://msdn.microsoft.com/en-us/library/ms178581.aspx的最後一部分 – David 2010-06-15 19:18:39

相關問題