403エラー、404エラー、MySpecialDomainException
に起因するすべてのエラーを処理し、他のすべてのエラー(IIS構成のエラーを含む)のデフォルトのエラーページを提供します!)すべてのエラーは適切なRazorビューを返す必要がありますが、ビューの前にErrorController
があると非常に便利ですEgこのようなもの:
public class ErrorController : Controller
{
public ViewResult NotFound () { return View(); }
public ViewResult Forbidden () { return View(); }
public ViewResult Default ()
{
var ex = ObtainExceptionFromSomewhere();
if(ex is MySpecialDomainException)
return View("MySpecialDomainException", new ErrorModel { Exception = ex });
return View("GeneralError", new ErrorModel { Exception = ex });
}
}
現在、wwwでそれを行うための多くの異なる方法を見つけていますが、いくつかはおそらく時代遅れです。それらの中で:
Q1: ASP.NET MVC 5の要件を満たすために推奨される方法は何ですか?
また、IISホストで発生するエラーをキャッチします。Q2:それを防ぐために、IISは、考えていた404すべての可能なURLに一致するデフォルトルートの追加について-これは推奨されますか?IISの404にも代わりに登録する方が良いですか?
Q3:コントローラに戻るIISエラーページを登録することも可能ですか、またはIIS ASPXに対応/静的HTMLのみ?
最善の方法はGlobal.Asaxを使用することです。これは、すべてのタイプのエラー(Ajax呼び出し/すべての予期しないエラー)を管理できるためです。他の人とはできません。
このような:
protected void Application_Error()
{
HttpContext httpContext = HttpContext.Current;
if (httpContext != null)
{
RequestContext requestContext = ((MvcHandler)httpContext.CurrentHandler).RequestContext;
/* When the request is ajax the system can automatically handle a mistake with a JSON response.
Then overwrites the default response */
if (requestContext.HttpContext.Request.IsAjaxRequest())
{
httpContext.Response.Clear();
string controllerName = requestContext.RouteData.GetRequiredString("controller");
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(requestContext, controllerName);
ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller);
JsonResult jsonResult = new JsonResult
{
Data = new { success = false, serverError = "500" },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
jsonResult.ExecuteResult(controllerContext);
httpContext.Response.End();
}
else
{
httpContext.Response.Redirect("~/Error");
}
}
}
すべてのアプリケーションに最適なソリューションはありません。
Web.configのhttpErrorsを使用して、わかりやすいエラーページを表示できます。 customErrorsとは異なり、これはIISレベル設定であり、ASP.NET内からではないエラーのわかりやすいエラーページも表示します。
エラーロギングについては、ELMAHのようなHttpModuleを使用することをお勧めします。 https://code.google.com/p/elmah/
私はこれについてブログ記事全体を書き、エラー処理のさまざまな方法を説明しています: http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging =
エラーを処理するより良い方法は、handleerror属性を拡張することです。エラー処理属性には次の利点があります
HandleErrorAttributeを使用すると、例外処理をより詳細に制御できます。 HandleErrorを使用すると、Application_Errorでこの機能を取得するためにスイッチループの助けを借りて、コントローラーやアクションごとにエラーを簡単に処理できます。
Application_Errorに入ると、MVCが終了し、ControllerContextを失うことになり、HandleErrorで簡単にできることはほとんどできなくなります。
エラー処理属性と利点を拡張する方法については、次の投稿を参照してください
Application_Errorに対する[HandleError]の利点
http://maheshde.blogspot.com.au/2012/09/error-handing-with-mvc-using-custom.html
http://www.codeproject.com/Articles/731913/Exception-Handling-in-MVC