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ソースコード(最新のソースコードと一致しない可能性があります)
 
        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.最も簡単な方法はノードの設定です
ノードは、いくつかのカスタムエラー情報の情報を定義するために使用されます.このノードには、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
?
   
  •         

  •         
  •   
  • <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
    print
    ?
    public class UtilityController : Controller  
  •     {  

  •         public ActionResult Error()  
  •         {  

  •             return View();  
  •         }  

  •   
  •         public ActionResult PageNotFound()  

  •         {  
  •             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();  
  •             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));  
  •             }  

  •         }  
  •     }