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;
    }
},

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

感谢您的帮助杰森

4

1 回答 1

3

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

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

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

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

于 2013-07-25T15:32:27.957 回答