更新
この回答は解決策を提供するため、編集しませんが、この問題を解決するよりクリーンな方法を見つけました。詳細については、他の回答を参照してください...
元の回答:メソッドが呼び出されない
理由がわかりました...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 に Error ビューを探すように指示し、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 をクリックして直接アクセスできます
これらの問題には回避策がありますが、余分な作業を行うほど心配していませんでした。
これがみんなに役立つことを願っています!