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原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。 |
分类:
Mvc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2008-12-20 GridView 动态创建列回发再绑定的解决!
2008-12-20 OpenSUSE 11 下 Mono 2 开发笔记。