filterCtext.ExceptionHandled属性是否由MVC设置为true或者是否仅由用户代码设置为true?如果是这样,这会发生在哪里?
filterContext.ExceptionHandled
当action方法抛出异常时,get设置为true.默认情况下HandleErrorAttribute
已在FilterConfig
注册的类中添加Application_Start()
.发生异常时,将OnException
在HandleErrorAttribute
类中调用该方法.
在OnException
方法中,在使用之前删除当前HTTP响应主体之前 Response.Clear()
,该ExceptionHandled
属性将设置为true.
下面是默认的OnException方法:
public virtual void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.IsChildAction)
{
return;
}
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
{
return;
}
Exception exception = filterContext.Exception;
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;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3285 次 |
最近记录: |