この質問に対する受け入れられた回答を使用して、カスタム エラー処理ロジックを実装しました。Visual Studio 2012 を実行しているローカル PC でうまく機能し、403、404、および一般的なエラー用のカスタム ビューを作成できました。問題は、Azure にデプロイしたときに、MVC アプリケーションではなく、IIS がエラー メッセージを表示し始めたことです。MVC がエラー メッセージ処理を制御できるようにするために必要な構成変更はありますか?
3 に答える
PC(IISExpressを使用するWindows8)でデフォルト設定が異なる理由はわかりませんが、Windows 2012 Server(IIS 8)に展開する場合は、Web.configsystem.webServerセクションに以下を追加する必要があります。
<httpErrors errorMode="Detailed" />
あなたが参照したものとは別の解決策をお勧めします。私はこれについて少し錆びていますが、セットアップはかなり簡単だったことを覚えています。コードや構成が多すぎない。私の設定は次のようになります。
<!--This is the catch all error page. All these views are located in project directory Views/Shared -->
<customErrors mode="On" defaultRedirect="~/error/Error">
<!--Custom 404-->
<error statusCode="404" redirect="~/error/Notfound"></error>
<!--Custom 401-->
<error statusCode="401" redirect="~/error/NotAuthorized"></error>
</customErrors>
エラーのカスタム/汎用ログを追加する場合は、独自の HandleErrorAttributeを作成してみてください。継承を使用し、OnException メソッドをオーバーライドします。このようなもの:
public class CustomErrorHandler : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//your logging code here
base.OnException(filterContext);
}
}
例外をキャッチして、カスタム エラー ページを表示させることもできます。私のアプリでは、これを使用して 401 をカスタマイズします。Global.cs RegisterGlobalFilters は次のようになります。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomErrorHandler
{
ExceptionType = typeof(NotAuthorizedHttpException),
View = "NotAuthorized",
Order = 2
});
//Leave this line uncommented to let your customer error handler
filters.Add(new CustomErrorHandler ());
}
これが機能するために特別なルートを登録する必要はありませんでした。最後の警告。エラー ページがプロジェクトに含まれていることを確認してください。含まれていない場合、Azure に発行するときにデプロイされません。
それが役立つことを願っています!
問題は、デプロイされたバージョンのデフォルトのエラー ハンドラーが Application_Error ロジックをオーバーライドしていることです。デプロイされて customErrors mode="On" に設定された web.config トランスフォームを確認し、適切なリダイレクトを設定します。次に、グローバル フィルターの HandleError を無効にする必要があります。RegisterGlobalFilters の HandleErrorAttribute 行をコメントアウトします。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
}