[HandleError]
グローバル属性の実装方法は次のとおりです。
public virtual void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))
{
Exception innerException = filterContext.Exception;
if ((new HttpException(null, innerException).GetHttpCode() == 500) && this.ExceptionType.IsInstanceOfType(innerException))
{
string controllerName = (string) filterContext.RouteData.Values["controller"];
string actionName = (string) filterContext.RouteData.Values["action"];
HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
ViewResult result = new ViewResult {
ViewName = this.View,
MasterName = this.Master,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
filterContext.Result = result;
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
}
ステータス コードを 500 に設定し、~/Views/Shared/Error.cshtml
ビューをレンダリングする方法に注目してください。これはすべて、カスタム エラーが有効になっている場合に発生します。
ちなみに、これはこの例外的なケースで使用される意味的に正しい HTTP ステータス コードです。または、要求されたリソースが見つからない場合は 404。200 は、サーバーがユーザー要求を正常に処理した場合にのみ使用してください。
何らかの理由でこの動作が気に入らない場合は、いつでもカスタム グローバル エラー処理属性を記述して、デフォルトのもの ( ~/App_Start/FilterConfig.cs
->内に登録されているfilters.Add(new HandleErrorAttribute());
) を置き換えることができます。