Mvc2.0 处理自定义错误.
遇到很奇怪的问题:
新建Mvc2.0项目,添加新的Area,在 Area里的 Web.config 配置 <customErrors mode="On"/> , 在Area里的Controller 加上 ErrorHandle , 在Shared里添加 Error.aspx.
Action 抛一个错.
显示正确的 Error.aspx 里的信息,没问题.
在真实项目中, 不能通过. 显示 运行时错误,需要配置 customErrors .
到现在依然没有找到真正的原因.
现只记录解决的结果(在此感谢 TomXu 的大力帮助 ):
public class MyError : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.StatusCode = 500;
ProcException(filterContext, filterContext.Exception);
}
public static void ProcException(ControllerContext filterContext, Exception exp)
{
#region errorHtml
string ErrorHtml = @"error";
#endregion
ErrorHtml = ErrorHtml.Replace("~/", MyUrl.GetUrlHeader())
.Replace("$ErrorMsg$", exp != null ? exp.Message : "");
//base.OnException(filterContext);
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.Write(ErrorHtml);
filterContext.HttpContext.Response.Flush();
filterContext.HttpContext.Response.End();
}
}
[MyError]
public class MyHostController : MyMvcController
{
protected override IActionInvoker CreateActionInvoker()
{
return new MyHostActionInvoker();
}
protected override void HandleUnknownAction(string actionName)
{
try
{
base.HandleUnknownAction(actionName);
}
catch (Exception e)
{
this.ControllerContext.HttpContext.Response.StatusCode = 404;
MyError.ProcException(this.ControllerContext, e);
}
}
}
发现有两个 Exception 的地方, 一个是 ExceptionContext.Exception ,另一个是 HttpContext.Current.Error,而两个Exception 没有多大关系。
个人初步判断: 如果 HttpContext.Current.Error 里有错误,则会抛到 IIS 来处理。而Mvc的错误处理机制是 Exception 保存在了 ExceptionContext 中,绕开了HttpContext.Current.Error 。
待日后验证。
|
作者:NewSea 出处:http://newsea.cnblogs.com/
QQ,MSN:iamnewsea@hotmail.com 如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。 |

浙公网安备 33010602011771号