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

これは実際、私にとって良い「教訓」でした。アプリケーションの背景と私が見ていた問題について少し説明します。私は、更新パネルをできるだけ多く使用するアプリケーションを作成して、流れるような素敵なアプリケーションを作成したいと考えました。このように、ポストバックやページ転送がなければ、すべてが同期しているとユーザーに思わせるエクスペリエンスを作成したかったのです。アプリケーションは当社用で、ローカルのイントラネットでも実行されていました。

これを行うために、アプリケーションの各コンポーネントを分解し、独自のサーバー コントロールを作成しました。たとえば、グリッドビュー、ボタンなどを備えたモーダル ダイアログで構成される 1 つのユーザー コントロール (ASCX) にコントロールのグループを追加しました。行き来するすべてのデータを追跡するために、各コントロールはセッション内の独自のデータを追跡しました。ほとんどの場合、セッション内のこのデータはオブジェクトのリストでした。アプリケーションが大きくなるにつれて (つまり、ユーザーがアプリケーションを使用すると、セッションが大きくなります)、断続的なエラーが発生します。これらのエラーは、サーバーにプッシュしたときにのみ発生しましたが、ローカルのデバッグとローカル IIS サーバーで正常に実行されました。エラーを追跡するのに数日かかりましたが、セッションに保持されていたオブジェクトが散発的に「失われる」ことになりました。

結局のところ、IIS にはメモリ サイズの上限がありました。その上限に達すると、IIS のアプリケーション プールが再起動され、すべてのセッションがリセットされます。キャップをしなければならなかったので、これはローカルでは発生しませんでした。そのため、データを永続化する方法を再考する必要がありました。ほとんどのデータにビュー ステートを使用することになりました (これには、クラスをシリアル化する必要があります)。ビューステートを使用できず、セッションに依存しなければならないコントロールがありました。今回は、必要がなくなったときにすべてのセッション データを消去するために呼び出すことができるメソッドを追加したことを確認しました。

将来的には、私はいくつかの異なることをすると思います。まず、Sessions の使い方をもっと慎重に考えてください。ビュー ステートに制限があるかどうかはわかりませんが、まだ問題は発生していません。また、更新パネル (ajax コントロールのツールキットをすべてまとめたもの) には近づかず、通常の ajax に頼ると思います。第 2 に、更新パネルは迅速な開発を可能にしますが、部分的なポストバックのコストが高くなります。

于 2013-07-25T15:32:27.957 に答える