- 工信部备案号 滇ICP备05000110号-1
- 滇公安备案 滇53010302000111
- 增值电信业务经营许可证 B1.B2-20181647、滇B1.B2-20190004
- 云南互联网协会理事单位
- 安全联盟认证网站身份V标记
- 域名注册服务机构许可:滇D3-20230001
- 代理域名注册服务机构:新网数码
ASP.NET MVC下自定义错误页和展示错误页的方式
在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的。
这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的。
首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是网站所依赖的宿主抛出的,一般来讲我们所依赖的宿主就是IIS了。
IIS中的错误页入口:
其中的错误码想必并不陌生
这里是在服务器上找不到所需资源时抛出的错误页,在这里可以设置需要展示的错误页面,只需将预定的错误页面加入服务器中,然后在指定状态码下配置路径即可。
这是请求在IIS中时,还未完全进入到asp.net mvc中,这里需要理解什么是未完全进入,IIS7+的版本中,不依赖于请求路径末尾的标识信息,利用mvc中的urlRoutingModule进行处理,在我们配置mvc的路由时,首先的第一条:
1 | routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" ); |
便是隔离非mvc内部的使用文件,如果请求的只是服务器上的文件,那么路由便会在这里进行过滤,使之不匹配具体路由信息。
也就只是和mvc打了个招呼 然后就走了,没有进入mvc中搞事情。
第二种是,进入了asp.net mvc的管辖范围,然后在其中出错了,便是跳到我们在程序中配置的错误页了。
首先讲讲我从博友那里学到的、看到的几种方式。
第一种是在web.config中通过customError配置。
1 2 3 | <customErrors mode= "On" defaultRedirect= "~/Error/ErrorPage" > <error statusCode= "404" redirect= "~/Error/ErrorPage404" /> </customErrors> |
但是这种方式不怎么令人接受,太过于简单,没有一点异常信息,并且有时候还不能起效果,我不太喜欢这种方式。
这种是用框架封装好的,利用的是将要说的第三种的强大方式实现的,当有异常发生又没得捕获时,最终利用的第三种方式自动实现。
第二种是利用HandlerErrorAttribute 特性,利用AOP的方式,当有异常出现时,便会进入具体实现了这个特性的,且被注册了的ExceptionAttribute职责中。
namespace SAssassin.Web.Core.Filter { /// <summary> /// 异常处理之日志记载采用消息队列方式 /// </summary> public class MyExceptionAttribute : HandleErrorAttribute { public static Queue<Exception> ExceptionQueue = new Queue<Exception>(); public override void OnException(ExceptionContext filterContext) { ExceptionQueue.Enqueue(filterContext.Exception); filterContext.HttpContext.Response.Redirect( "~/ErrorPage/CustomErrorPage" ); base .OnException(filterContext); } } } |
在这里,我可以得到异常信息,也可以解析具体的异常报错原因,比如404,500... 可以通过这种形势,将其转移到不同的自定义错误页面上,此处我增加了一个控制器
CustomErrorPageController,专门用来存放错误页面,原有的Shared下的Error.cshtml错误页面也仍然存在着。
我比较喜欢这种方式,一来可以看到异常信息,而来可以设计需要跳转的错误页面。
第三种方式也是最强大的、俗称"最后一道防线",从全局层面去捕捉异常的Application_Error
当网站初次启动时,会执行一个特殊的动作,Application_start 首先执行,也只初始化一次。这个也是Application 中的事件。
// // 摘要: // ASP.NET 将 HTTP 标头发送到客户端之前发生。 public event EventHandler PreSendRequestHeaders; // // 摘要: // 在选择该处理程序对请求作出响应时发生。 public event EventHandler MapRequestHandler; // // 摘要: // 释放应用程序时发生。 public event EventHandler Disposed; // // 摘要: // 作为执行的 HTTP 管道链中的第一个事件发生,当 ASP.NET 的请求做出响应。 public event EventHandler BeginRequest; // // 摘要: // 当安全模块已建立的用户标识时出现。 public event EventHandler AuthenticateRequest; // // 摘要: // 当安全模块已建立的用户标识时出现。 public event EventHandler PostAuthenticateRequest; // // 摘要: // 安全模块已验证用户身份验证时发生。 public event EventHandler AuthorizeRequest; // // 摘要: // 当前请求的用户已被授权时发生。 public event EventHandler PostAuthorizeRequest; // // 摘要: // 当 ASP.NET 完成授权事件以便从缓存中,跳过的事件处理程序 (例如,一个页面或 XML Web 服务) 执行的请求提供服务的缓存模块时发生。 public event EventHandler ResolveRequestCache;
|