customErrors要素のMSDNドキュメントには、System.Web.Configuration.CustomErrorsSectionによって実装されると記載されています。RedGateの.NETReflectorを使用してそのクラスを分析すると、その設定がフレームワークのどこで使用されているかを確認できます。
これは、System.Web.UI.Page.HandleErrorおよびSystem.Web.HttpResponse.ReportRuntimeErrorによって使用されます。
これらは両方とも、System.Web.HttpResponse.RedirectToErrorPageを呼び出すことになります。(このメソッドの名前は紛らわしいです。RedirectToErrorPageはredirectMode設定をパラメーターとして受け取るため、ResponseRewriteを使用していて、実際にはリダイレクトが発生しない場合でも呼び出されることに注意してください。)
RedirectToErrorPageメソッドの関連部分は次のとおりです。
if (redirectMode == CustomErrorsRedirectMode.ResponseRewrite)
{
this.Context.Server.Execute(url);
}
エラー処理で応答コードを設定する方法はないようです。結局のところ、それは単なるServer.Executeです。したがって、必要なHTTP応答を実現するためのコードを作成する必要があることは避けられないようです。
プレーンな.htmlファイルを使用する理由を再検討できますか?別のエラーが発生する可能性がある場合に.aspxページのオーバーヘッドをすべて処理したくないため、これはエラー処理の賢明な選択のようです。
しかし、おそらく.htmlファイルと同じくらい堅牢な中間点があるのでしょうか。
たとえば、プリコンパイルされたHttpHandlerを作成し、それをURL /500.errorに登録してから、500.errorをdefaultRedirectページにすることができます。(これは、ScriptResource.axdの動作と似ています。)モジュールをDLLにプリコンパイルすると(単純な古い.axdファイルからのオンザフライコンパイルとは対照的に)、同じように堅牢であることがわかります。エラー状態の顔。これでも機能しないエラーが発生した場合は、静的な.htmlファイルも機能しない可能性があります。customErrorsディレクティブは引き続き内部で実行されている.NETに依存し、StaticFileHandlerを使用してサービスを提供することに注意してください。 .htmlファイル。
または、IISアプリケーションの前にリバースプロキシを配置して、アプリケーションプールの壊滅的な障害が発生した場合でも、フレンドリーな500ページを提供することを検討できます。これは設定に手間がかかりますが、customErrorsよりもさらに堅牢になります。たとえば、web.configが破損した場合、customErrorsでさえ機能しなくなります。