2013-07-17 48 views
2

我的應用程序出現問題。該Web應用程序非常大,通過使用多個ascx和VB服務器控件來工作,每個控件都使用更新面板執行各種部分後置處理。在我的本地機器上一切正常,但是當我將我的應用程序推送到服務器(IIS)時,我注意到我的應用程序在更新更新面板時會引發錯誤。這是錯誤:部分回傳出錯

Sys.WebForms.PageRequestManagerServerErrorException: Object reference not set to an instance of an object. 

我不確定是什麼導致此錯誤或如何跟蹤哪個控件導致此問題。我試過使用IE的開發工具來調試實時應用程序。該錯誤似乎源自Web資源MicrosoftAjaxWebForms.debug.js。這個問題的功能是:

_endPostBack: function PageRequestManager$_endPostBack(error, executor, data) { 
    if (this._request === executor.get_webRequest()) { 
     this._processingRequest = false; 
     this._additionalInput = null; 
     this._request = null; 
    } 

    var eventArgs = new Sys.WebForms.EndRequestEventArgs(error, data ? data.dataItems : {}, executor); 
    Sys.Observer.raiseEvent(this, "endRequest", eventArgs); 
    if (error && !eventArgs.get_errorHandled()) { 
     throw error; 
    } 
}, 

數據變量是空的。任何人都知道如何解決這個問題,或者如何明確地發現我的網頁上哪些控件導致了這個問題?

感謝所有幫助 傑森

+0

框架(.NET和AJAX)的版本是否與您的計算機和部署服務器相同? –

+0

感謝您的回覆。是的,兩者都運行在4.0 .Net框架和AjaxcontrolToolkit dll的4.1.60919版本上 – jason

回答

3

這其實對我來說是很好的「經驗教訓」。關於應用程序和我看到的問題的一點背景。我決定創建一個應用程序,儘可能使用更新面板,以創建一個流暢的應用程序。通過這種方式,我想爲用戶創造一種體驗,讓他們認爲所有內容都是同步的,並且沒有回傳或頁面傳輸。該應用程序適用於我們公司,並且也在本地Intranet上運行。

爲了做到這一點,我爆發了我的應用程序的每個組件,並創建了自己的服務器控件。例如,我將一組控件添加到單個用戶控件(ASCX)中,該控件包含一個帶有GridView,按鈕等的模式對話框。爲了跟蹤所有數據傳入和傳出,每個控件都會在會話中跟蹤它自己的數據。大多數情況下,會話中的這些數據都是對象列表。隨着應用程序的增長(也就是說,隨着用戶使用應用程序,會話會增加),我會得到間歇性錯誤。這些錯誤只發生在我將它推送到我們的服務器上時,但在本地調試和本地IIS服務器上正常運行。這個錯誤讓我花了幾天的時間來追蹤,但最終成爲一個對象會保持在會話中偶爾會「失去」。

事實證明,我們的IIS在內存大小方面有上限。達到上限後,IIS的應用程序池將重新啓動,導致所有會話都被重置。這不是在當地發生的,因爲我必須上限。所以,我不得不重新考慮數據如何持續存在。我最終使用視圖狀態來獲取大部分數據(這要求將這些類序列化)。我確實有一個無法使用視圖狀態的控件,不得不依賴會話。對於這個,我確定我添加了一個可以調用的方法,在不再需要時清除所有會話數據。

未來,我想我會以不同的方式做一些事情。首先,使用會話更明智。我不確定視圖狀態是否有任何限制,但我還沒有遇到任何問題。我也認爲我會遠離更新面板(ajax控件loolkit),並依賴於常規的ajax。其次,更新面板使快速開發成本更高,部分回發。