1

カスタムエラーを使用するASP.NETアプリケーションがあります。情報が得られないように見えるエラーが1つあります。エラーが発生すると、カスタムエラーページがトリガーされますが、何らかの理由でPage_ErrorまたはApplication_Errorはトリガーされません。CustomErrorsを完全にオフにすると、フィードバックはまったく得られません。私がこれまでに得た唯一のフィードバックは、カスタムエラーページへのリダイレクトです。

シナリオ:ASP.NETWebFormsアプリケーション。ページの1つに、[送信]ボタンのあるUpdatePanelがあります。ページは正常に機能します。しかし、しばらく離れて(30〜60分と思われる)、戻って[送信]ボタンをクリックしても、何も起こりません。エラーなし、ページからの応答なし-何もありません。デバッガーで実行しているときにこれを発生させることができませんでした。IIS(7.5)でホストされている場合にのみ発生します。[この問題に関する他のSOの投稿を見たことがありますが、どの提案もうまくいきませんでした。]

CustomErrors = OnまたはRemoteOnlyを使用してエラーが発生すると、カスタムエラーページへのリダイレクトが機能し、サーバーからRemoteOnlyを使用すると、customerrors = offを使用したリモート接続と同様に、フィードバックがまったく得られません。YSODエラーページを本当に望んでいました。

エラーをデータベースに記録してPage_Errorにエラーをトラップしようとしましたが、それも機能しませんでした。Page_ErrorとDB部分が機能していることはわかっています。これは、送信コードビハインドを変更してゼロ除算を実行すると、エラーがDBに記録されるためです。また、ゼロ除算エラーはcustomerrors = offでクライアントに表示され、それをオンにするとカスタムエラーページが表示されます。ただし、ゼロ除算エラーを削除してから30分ほど待ってから再試行すると、カスタムエラーページにリダイレクトされても、Page_Errorコードはヒットしません。次に、Page_ErrorのコードをApplication_Errorに移動しようとしましたが、まったく同じことが起こります。エラーによる強制除算は機能しますが、この一見タイムアウト関連のエラーは機能しません。

それで、カスタムエラーページへのリダイレクトをトリガーできるが、Application_Errorイベントをトリガーしない特定のエラーはありますか?

4

1 に答える 1

1

ジョンとセルゲイ、ありがとう!これは本当にワームの缶でした。Sergey さん、まさにその通りでした。セッションがタイムアウトしました。John さんのアイデアを見て、コード内で追跡するのではなく、Windows アプリケーション イベント ログを確認するようになりました。セッションがタイムアウトしたときに ViewState の有効期限が切れていたことが判明しました。これはデフォルトで 20 分に設定されていました。正確なイベント ログ エラーは次のとおりです。

「ビューステートの検証に失敗しました。理由: 提供されたビューステートが整合性チェックに失敗しました。」

これで、アプリ プールを手動でリサイクルし、暇なときにエラーを強制的に発生させることができるようになり、解決が容易になりました。少なくとも問題のページではセッションを使用していませんでしたが、なぜこれが問題なのですか? このリンクは、何が起こっているのかをトラブルシューティングするのに役立ちました。

http://support.microsoft.com/default.aspx?scid=kb;en-us;829743

記事の奥深くに埋もれているのは、ワーカー プロセスのリサイクルを引き起こすシナリオを説明する次の文です。

「アプリケーション プールは、ローカル システム アカウント、ネットワーク サービス アカウント、または管理者レベルのアカウント以外の ID で実行されています。」

実際、私の AppPool は、この目的のために特別に作成したローカル ユーザー アカウントで実行されています。AppPool を ApplicationPoolIdentity で実行するように変更したとき、AppPool をリサイクルした後、ViewState エラーはなくなりました。次に、AppPool を再びローカル ユーザー アカウントで実行するように設定し、そのアカウントにローカル管理者権限を与えました。これも修正されました。このユーザーをローカル管理者にしたくないので、新しいソリューションを自動生成するデフォルトを使用するのではなく、ViewState MAC が常に同じになるように、このアプリのマシン キーを生成する別のソリューションを使用することになりました。プールがリサイクルされるか、セッションがタイムアウトするたびに 1 つ。これは、ロード バランサーの背後に複数の Web サーバーがある場合に通常行う必要があることにも注意してください。

于 2013-02-07T04:00:30.653 に答える