部分回发出错

时间:2013-07-17 13:53:43

标签: asp.net iis updatepanel ajaxcontroltoolkit

我的申请存在问题。 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;
    }
},

数据变量是空的。任何人都知道如何解决这个问题或如何找出我的页面上的哪个控件导致问题?

感谢您的帮助 杰森

1 个答案:

答案 0 :(得分:3)

这对我来说实际上是一个很好的“经验教训”。关于应用程序的一些背景和我看到的问题。我决定创建一个尽可能使用更新面板的应用程序,以创建一个漂亮的流动应用程序。通过这种方式,我想为用户创建一种体验,让他们认为一切都是同步的,没有回发或页面传输。该应用程序适用于我们公司,也在本地Intranet上运行。

为了帮助实现这一点,我打破了应用程序的每个组件并创建了自己的服务器控件。例如,我将一组控件添加到一个用户控件(ASCX)中,该控件由一个带有网格视图,按钮等的模态对话框组成。为了跟踪所有来来往往的数据,每个控件都会在会话中跟踪它自己的数据。在大多数情况下,会话中的这些数据是对象列表。随着应用程序的增长(也就是说,当用户使用应用程序时,会话会增长)我会得到间歇性错误。这些错误只发生在我将其推送到我们的服务器但在本地调试和我的本地IIS服务器上运行良好时。这个错误让我花了几天的时间来追踪,但最后成为一个会被保留在会话中的对象偶尔会“迷失”。

事实证明,我们的IIS内存大小上限。达到该上限后,IIS的应用程序池将重新启动,从而导致重置所有会话。这不是在本地发生的,因为我不得不限制。所以,我不得不重新思考数据是如何持久化的。我最终使用了大部分数据的视图状态(这要求将类序列化)。我确实有一个控件,不能使用视图状态,不得不依赖会话。对于这个,我确保添加了一个方法,可以在不再需要时清除所有会话数据。

将来,我想我会做一些不同的事情。首先,通过使用Sessions更加明智。我不确定视图状态是否有任何限制,但我还没有遇到任何问题。我也认为我将远离更新面板(ajax控件loolkit一起)并依赖于常规的ajax。其次,虽然更新面板可以实现快速开发,但成本较高的部分回发。