ASP.NET MVCでの統一化カスタム例外処理
13861 ワード
システムのデフォルトのエラー処理方式を使用すると、リダイレクトアクセスを1回減らすことができ、エラー情報が正常に提示され、エラーコード500が送信されますが、以下の問題に注意してください.
一、webを修正する必要がある.config
二、デフォルトのError.を変更する場合cshtmlファイル、デフォルトのレイアウトページを使用しない、またはレイアウトページを変更するには、次のファイルを参照してください.
@Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap")
三、デフォルトのHandleErrorAttributeでは500エラーしか処理されていないので、これらを書き換えてフィルタを追加する必要があります.ログに書き込みます.
HandleErrorAttributeソースコード(最新のソースコードと一致しない可能性があります)
フィルタを使用しない場合は、以下を参照してください.
===========================================================================================================================================
HandleErrorAttributeを使って、Error.を見つけました.cshtmlは、この時点で異常がキャプチャ処理されているので、再度Application_Error捕獲処理.
だから、アプリを使いたいならError、もうすぐ
=======================================================================================================================================================================================
ASP.NET MVCプログラムに異常が発生しましたが、どのように処理すればもっと規範的ですか?
1.最も簡単な方法はノードの設定です
ノードは、いくつかのカスタムエラー情報の情報を定義するために使用されます.このノードには、ModeとdefaultRedirectの2つの属性があります.defaultRedirect属性は、アプリケーションにエラーが発生した場合にリダイレクトされるデフォルトのURLであり、指定されていない場合は一般的なエラーが表示されます.Modeプロパティは必須のプロパティで、3つの可能な値があります.Onは、ローカルユーザーとリモートユーザーでカスタムエラー情報が表示されることを意味します.Offはカスタムエラー情報を無効にし、ローカルユーザーとリモートユーザーに詳細なエラー情報が表示されます.RemoteOnlyは、ローカル・ユーザーが詳細なエラー情報を表示し、リモート・ユーザーがカスタム・エラー情報を表示することを示します.
ここでは,ローカルユーザとリモートユーザの概念を説明する必要がある.aspにアクセスするとNetアプリケーションで使用するマシンとaspをパブリッシュする.Netアプリケーションで使用するマシンが同じマシンである場合にローカルユーザとなり,逆にリモートユーザと呼ぶ.開発デバッグフェーズでは、エラーの検出を容易にするためにOffに設定することを推奨します.デプロイメントフェーズでは、これらの詳細なエラー情報がプログラムコードの詳細を暴露し、ハッカーの侵入を引き起こすことを避けるために、ModeプロパティをOnまたはRemoteOnlyに設定する必要があります.
サブノード
ノードの下にはサブノードも含まれています.このノードは主にサーバのHTTPエラーステータスコードに基づいてカスタマイズされたエラーページにリダイレクトされます.サブノードの構成を有効にするには、ノードのModeプロパティを「On」に設定する必要があります.次に例を示します.
[html]
view plain
copy
print
?
上記の構成では、ユーザがアクセスするページが存在しない場合は404にジャンプする.htmページは、ユーザが要求するページにアクセスする権限がない場合に403にジャンプする.htmページ、403.htmと404.htmページはすべて私たちが自分で追加したページで、私たちはページの中で友好的なエラーのヒントを与えることができます.
2.フィルターを使用するHandleErrorAttribute
ASPに従う.NET MVCバージョンの更新により,HandleErrorAttributeが出現し,Filterを用いてAOPの思想でActionに対する異常処理を実現した.このFilterを使用すると、プログラムに異常が発生すると、これらの異常情報がカプセル化され、そのコントローラに対応するErrorにルーティングが自動的に移行する.cshtmlでは、このパスの下でファイルが変更されていない場合、sharedディレクトリにファイルが見つかります.もう一つの関連はGlobalですasaxのprotected void Application_Error(object sender,EventArgs e)法は,異常を捕捉する最後の防御線,すなわち,最高レベルの異常捕捉処理ロジックである.HandleErrorAttributeを使って、Error.を見つけました.cshtmlは、この時点で異常がキャプチャ処理されているので、再度Application_Error捕獲処理.また、@model HandleErrorInfoによりError.cshtmlでカスタム表示異常情報.一つ注意したいのは、HandleErrorAttributeはcustomErrorsの基礎の上にあるので、HandleErrorAttributeを使用するには、customErrorsのModeをOnまたはRemoteOnlyに設定する必要があります.そうでなければ、HandleErrorAttributeは機能しません.
3.カスタム表示パス
例外が発生した場合、例外表示をカスタマイズするだけでなく、ログ記録も必要です.このとき、新しいFilterは、拡張HandleErrorAttributeを継承することによって実現され、lobal.ascxにはすべてのアクションが登録されています.filters.Add(new MyHandleErrorAttribute()).ここで別の方法を詳しく説明します.異常発生時のルーティングを行うための専用のControllerとActionを書くことができる.
[csharp]
view plain
copy
print
?
public class UtilityController : Controller {
public ActionResult Error() {
return View(); }
public ActionResult PageNotFound()
{ return View();
} }
異常が発生した場合、異常を最上位に投げ、Application_Error統一処理.ここでの統一処理には,ログの記録,ページの配向の再開などが含まれる.
protected void Application_Error(object sender, EventArgs e) {
var ex = Server.GetLastError(); Log.Error(ex);//ログ情報記録 var httpStatusCode = (ex is HttpException) ? (ex as HttpException).GetHttpCode() : 500;//ここでは2つのエラーのみを区別する var httpContext = ((MvcApplication)sender).Context;
httpContext.ClearError(); httpContext.Response.Clear();
httpContext.Response.StatusCode = httpStatusCode; var shouldHandleException = true;
HandleErrorInfo errorModel;
var routeData = new RouteData(); routeData.Values["controller"] = "Utility";
switch (httpStatusCode)
{ case 404:
routeData.Values["action"] = "PageNotFound"; errorModel = new HandleErrorInfo(new Exception(string.Format("No page Found", httpContext.Request.UrlReferrer), ex), "Utility", "PageNotFound");
break;
default: routeData.Values["action"] = "Error";
Exception exceptionToReplace = null;//ここではEntLibの異常処理モジュールのいくつかの機能を使用しています shouldHandleException = ExceptionPolicy.HandleException(ex, "LogAndReplace", out exceptionToReplace);
errorModel = new HandleErrorInfo(exceptionToReplace, "Utility", "Error"); break;
}
if (shouldHandleException) {
var controller = new UtilityController(); controller.ViewData.Model = errorModel;//コードによる指定された経路へのルーティング ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData)); }
} }
一、webを修正する必要がある.config
二、デフォルトのError.を変更する場合cshtmlファイル、デフォルトのレイアウトページを使用しない、またはレイアウトページを変更するには、次のファイルを参照してください.
@Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap")
三、デフォルトのHandleErrorAttributeでは500エラーしか処理されていないので、これらを書き換えてフィルタを追加する必要があります.ログに書き込みます.
HandleErrorAttributeソースコード(最新のソースコードと一致しない可能性があります)
public virtual void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.IsChildAction)
{
return;
}
// If custom errors are disabled, we need to let the normal ASP.NET exception handler
// execute so that the user can see useful debugging information.
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
{
return;
}
Exception exception = filterContext.Exception;
// If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
// ignore it.
if (new HttpException(null, exception).GetHttpCode() != 500)
{
return;
}
if (!ExceptionType.IsInstanceOfType(exception))
{
return;
}
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
filterContext.Result = new ViewResult
{
ViewName = View,
MasterName = Master,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
// Certain versions of IIS will sometimes use their own error page when
// they detect a server error. Setting this property indicates that we
// want it to try to render ASP.NET MVC's error page instead.
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
フィルタを使用しない場合は、以下を参照してください.
===========================================================================================================================================
HandleErrorAttributeを使って、Error.を見つけました.cshtmlは、この時点で異常がキャプチャ処理されているので、再度Application_Error捕獲処理.
だから、アプリを使いたいならError、もうすぐ
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
}
}
=======================================================================================================================================================================================
ASP.NET MVCプログラムに異常が発生しましたが、どのように処理すればもっと規範的ですか?
1.最も簡単な方法は
ここでは,ローカルユーザとリモートユーザの概念を説明する必要がある.aspにアクセスするとNetアプリケーションで使用するマシンとaspをパブリッシュする.Netアプリケーションで使用するマシンが同じマシンである場合にローカルユーザとなり,逆にリモートユーザと呼ぶ.開発デバッグフェーズでは、エラーの検出を容易にするためにOffに設定することを推奨します.デプロイメントフェーズでは、これらの詳細なエラー情報がプログラムコードの詳細を暴露し、ハッカーの侵入を引き起こすことを避けるために、ModeプロパティをOnまたはRemoteOnlyに設定する必要があります.
[html]
view plain
copy
?
<customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="403.htm" />
<error statusCode="404" redirect="404.htm" />
</customErrors>
上記の構成では、ユーザがアクセスするページが存在しない場合は404にジャンプする.htmページは、ユーザが要求するページにアクセスする権限がない場合に403にジャンプする.htmページ、403.htmと404.htmページはすべて私たちが自分で追加したページで、私たちはページの中で友好的なエラーのヒントを与えることができます.
2.フィルターを使用するHandleErrorAttribute
ASPに従う.NET MVCバージョンの更新により,HandleErrorAttributeが出現し,Filterを用いてAOPの思想でActionに対する異常処理を実現した.このFilterを使用すると、プログラムに異常が発生すると、これらの異常情報がカプセル化され、そのコントローラに対応するErrorにルーティングが自動的に移行する.cshtmlでは、このパスの下でファイルが変更されていない場合、sharedディレクトリにファイルが見つかります.もう一つの関連はGlobalですasaxのprotected void Application_Error(object sender,EventArgs e)法は,異常を捕捉する最後の防御線,すなわち,最高レベルの異常捕捉処理ロジックである.HandleErrorAttributeを使って、Error.を見つけました.cshtmlは、この時点で異常がキャプチャ処理されているので、再度Application_Error捕獲処理.また、@model HandleErrorInfoによりError.cshtmlでカスタム表示異常情報.一つ注意したいのは、HandleErrorAttributeはcustomErrorsの基礎の上にあるので、HandleErrorAttributeを使用するには、customErrorsのModeをOnまたはRemoteOnlyに設定する必要があります.そうでなければ、HandleErrorAttributeは機能しません.
3.カスタム表示パス
例外が発生した場合、例外表示をカスタマイズするだけでなく、ログ記録も必要です.このとき、新しいFilterは、拡張HandleErrorAttributeを継承することによって実現され、lobal.ascxにはすべてのアクションが登録されています.filters.Add(new MyHandleErrorAttribute()).ここで別の方法を詳しく説明します.異常発生時のルーティングを行うための専用のControllerとActionを書くことができる.
[csharp]
view plain
copy
?
public class UtilityController : Controller
public ActionResult Error()
return View();
{
}
public class UtilityController : Controller
{
public ActionResult Error()
{
return View();
}
public ActionResult PageNotFound()
{
return View();
}
}
異常が発生した場合、異常を最上位に投げ、Application_Error統一処理.ここでの統一処理には,ログの記録,ページの配向の再開などが含まれる.
protected void Application_Error(object sender, EventArgs e)
var ex = Server.GetLastError();
httpContext.ClearError();
httpContext.Response.StatusCode = httpStatusCode;
HandleErrorInfo errorModel;
var routeData = new RouteData();
{
routeData.Values["action"] = "PageNotFound";
break;
default:
Exception exceptionToReplace = null;//ここではEntLibの異常処理モジュールのいくつかの機能を使用しています
errorModel = new HandleErrorInfo(exceptionToReplace, "Utility", "Error");
}
if (shouldHandleException)
var controller = new UtilityController();
}