4

以前に呼び出された: aspx の負荷の下で動的に作成されたコントロールを処理する方法

以下の質問への回答: どのコントロールを復元するかを決定するために必要な情報は、専用のビューステート オブジェクトに含まれています。

コードビハインド ページでコントロールを動的に作成しています。これらのコントロールはすべてクリック ハンドラーに接続されているため、ポストバックが発生した場合は、以前のコントロール セットを再作成してから、コントロールをクリアして、新しいコントロール セットを生成する必要があります。前のクリック。

これはコード化されており、通常の状況では本質的に次のように正しく機能します。

in Page_Load
if not postback generate default buttons 
else if postback re-generate buttons that were shown on last page

in click_handler
Clear the dynamically generated buttons created in the Page_Load
generate new buttons based on the specific click being handled

ただし、サーバーに負荷がかかると、問題が発生し始めます。

1 秒あたり 5 ユーザーの場合、例外が発生し始めます 。同じ ID 'add0' を持つ複数のコントロールが見つかりました。FindControl では、コントロールに一意の ID が必要です。

1 秒あたり 100 ユーザーの場合、例外が発生し始めます 。コントロール コレクションは、DataBind、Init、Load、PreRender、または Unload フェーズ中に変更できません。

これが発生すると、後続のすべての要求で同じエラーが発生し、IIS を再起動する必要があります。

何が原因で、どうすれば回避できますか? html リクエストは、負荷がかかっているときに上書きして互いに干渉する可能性がありますか? ページがアンロードされた後、次のページのロードがそれらの上をつまずくことができるような方法で、オブジェクトが何らかの方法で処理されますか?

4

3 に答える 3

2

復元する必要があるコントロールに関する情報をどのように保存していますか? ViewState または ControlState を使用している場合、負荷がどのように影響するかわかりません。これが、どの複合コントロールでも行われる方法です。

Infragistics UltraWebGrid の使用中に 2 番目のエラーが発生しましたが、追跡できませんでした。コール スタックから、ロード フェーズ (またはおそらく LoadViewState) 中に、EnsureChildControls が呼び出されているように見えました。

于 2009-04-02T15:07:43.387 に答える
2

ページのライフサイクル中にテーブル セルが再作成されないように、名前とテーブル セルのディクショナリを格納するためにプライベートな静的変数が使用されていました。

重要なポイントは、それが静的とマークされたことです-インスタンス変数であるべきでした-最終結果は、リクエストがバックアップを開始したときに負荷がかかり、複数のリクエストがこの静的辞書を共有していたことです。

正確に何が起こったのかは 100% わかりませんが、負荷が中程度の場合、FindControl は同じ名前の複数のコントロールを見つけます。負荷が非常に高い場合、1 つのリクエストがコントロールの変更 (おそらく追加) を試みるようです。他のリクエストからの無効な状態。

最終結果-自分が何をしているのか本当にわからない場合-静的変数よりもインスタンス変数を好みます。

于 2009-04-03T14:03:16.210 に答える
0

あなたが書いたことはすべて正しく、実行可能のようです。ほとんどの場合、これはコントロール生成コードの問題です。おそらく、その一部を投稿していただければ、解決策をより適切に見つけることができます。

于 2009-04-03T00:14:42.803 に答える