属性を使用してコントローラーのすべての例外を処理する

ASP.NET MVCには、このような属性HandleErrorAttribute



があり、MSDNで述べられているように、
アクションメソッドによって発生した例外の処理に使用される属性を表します。



しかし、どこでも、同じMSDNでは、サーバー応答コードを500に設定する例外のみを処理することは言われていません( 私があなたの鼻で突いて 、それが書かれているリンクを与えてください)。



HandleErrorAttribute



のソースコードを確認するのHandleErrorAttribute



簡単です。 次の行があります。



 // 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; }
      
      





私はあなたについては知りませんが、例外が発生すると、ユーザーが「死の黄色いページ」ではなく、サーバー応答コード(Web.configの設定によって異なります)後で詳しく説明します)。





独自のAnalog HandleErrorAttribute



作成



そのため、標準のHandleErrorAttribute



は私たちに合わないことがわかったので、独自に作成してみましょう。



もちろん、 IExceptionFilter



インターフェイスから継承するクラスを作成できますが、一般に、すべての例外を処理した場合の標準HandleErrorAttribute



動作に満足しています。 そして、ほとんどすべてが私たちに合っているので、クラスは私たちにとって好ましくないHandleErrorAttribute



から継承します。



 public class HandleAllErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } // 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 (!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 = new HttpException(null, exception).GetHttpCode(); // 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



を確認するHttpStatusCode



を除いて、これが標準のHandleErrorAttribute



コードであるとHttpStatusCode



ます。



実際に彼がしていること:





クラスの準備ができました。次に、標準属性を自分のものに置き換えます。 すべてのコントローラーまたはコントローラーアクションに書き込まないように、グローバルフィルターを使用してこれを行います。 この場合、これは重要ではありませんが、実際には便利です。 したがって、 Global.asax.csに移動し、作成したばかりの属性である標準フィルターの代わりに設定します。



 filters.Add(new HandleAllErrorAttribute());
      
      







テスト



ここで、フィルターが機能し、必要なデータがView



渡されることを確認するために標準の〜/ Views / Shared / Error.cshtmlをわずかに変更します。



 @model System.Web.Mvc.HandleErrorInfo @{ ViewBag.Title = "Error"; } <h2> Sorry, an error occurred while processing your request. </h2> <h3>@Model.Exception.Message</h3>
      
      





そして、ルートにあるWeb.configSystem.Web



セクションに次の行を追加します。



 <customErrors mode="On" defaultRedirect="Error" />
      
      





この行を使用して、カスタムエラー処理、より正確にはカスタムエラーページを有効にします。



ここで、例外を発生させる必要があります。これは、スタジオが作成した標準コントローラーのアクションで行います。



 public ActionResult About() { throw new HttpException(403, " !"); return View(); }
      
      





それだけです! プロジェクトを開始し、「About」セクションに移動して、属性が正しく機能したことを確認します。








All Articles