更新
この回答は解決策を提供するので、私はそれを編集しませんが、この問題を解決するはるかにきれいな方法を見つけました。詳細については、他の回答を参照してください...
元の回答:メソッドが呼び出されない
理由がわかりましたApplication_Error()
...
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); // this line is the culprit
}
...
}
デフォルトでは(新しいプロジェクトが生成されるとき)、MVCアプリケーションはGlobal.asax.cs
ファイルにいくつかのロジックを持っています。このロジックは、ルートのマッピングとフィルターの登録に使用されます。デフォルトでは、フィルターを1つだけ登録しHandleErrorAttribute
ます。customErrorsがオンの場合(またはRemoteOnlyに設定されている場合はリモート要求を介して)、HandleErrorAttributeはMVCにエラービューを探すように指示し、Application_Error()
メソッドを呼び出すことはありません。これに関するドキュメントは見つかりませんでしたが、programmers.stackexchange.comのこの回答で説明されています。
未処理の例外ごとに呼び出されるApplicationError()メソッドを取得するには、HandleErrorAttributeフィルターを登録する行を削除するだけです。
今問題は:あなたが望むものを得るためにcustomErrorsを設定する方法...
customErrorsセクションのデフォルトはredirectMode="ResponseRedirect"
です。defaultRedirect属性をMVCルートに指定することもできます。非常にシンプルなErrorControllerを作成し、web.configを次のように変更しました...
web.config
<customErrors mode="RemoteOnly" redirectMode="ResponseRedirect" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/PageNotFound" />
</customErrors>
このソリューションの問題は、エラーURLへの302リダイレクトを実行し、それらのページが200ステータスコードで応答することです。これは、Googleがエラーページをインデックスに登録することにつながり、これは悪いことです。また、HTTP仕様にあまり準拠していません。私がやりたかったのはリダイレクトではなく、元の応答をカスタムエラービューで上書きすることでした。
変えてみましたredirectMode="ResponseRewrite"
。残念ながら、このオプションはMVCルートをサポートせず、静的HTMLページまたはASPXのみをサポートします。最初は静的なHTMLページを使用しようとしましたが、応答コードはまだ200でしたが、少なくともリダイレクトされませんでした。私はこの答えからアイデアを得ました...
エラー処理のためにMVCをあきらめることにしました。とを作成しましError.aspx
たPageNotFound.aspx
。これらのページは非常にシンプルでしたが、魔法が1つありました...
<script type="text/C#" runat="server">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Response.StatusCode = (int) System.Net.HttpStatusCode.InternalServerError;
}
</script>
このブロックは、ページに正しいステータスコードを提供するよう指示します。大まかには、PageNotFound.aspxページでは、HttpStatusCode.NotFound
代わりに使用しました。web.configを次のように変更しました...
<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/Error.aspx">
<error statusCode="404" redirect="~/PageNotFound.aspx" />
</customErrors>
それはすべて完璧に機能しました!
概要:
- 行を削除します。
filters.Add(new HandleErrorAttribute());
- 使用
Application_Error()
例外をログに記録する方法
- ASPXページを指すResponseRewriteでcustomErrorsを使用する
- ASPXページが独自の応答ステータスコードを処理するようにする
このソリューションで気付いた欠点がいくつかあります。
- ASPXページは、Razorテンプレートとマークアップを共有できません。一貫したルックアンドフィールを実現するために、Webサイトの標準のヘッダーとフッターのマークアップを書き換える必要がありました。
- * .aspxページは、URLを押すことで直接アクセスできます。
これらの問題の回避策はありますが、余分な作業を行うほど心配する必要はありませんでした。
これが皆さんのお役に立てば幸いです。