ASP.NET MVC下自定義錯(cuò)誤頁(yè)和展示錯(cuò)誤頁(yè)的方式
在網(wǎng)站運(yùn)行中,錯(cuò)誤是不可避免的,錯(cuò)誤頁(yè)的產(chǎn)生也是不可缺少的。
這幾天看了博友的很多文章,自己想總結(jié)下我從中學(xué)到的和實(shí)際中配置的。
首先,需要知道產(chǎn)生錯(cuò)誤頁(yè)的來(lái)源,一種是我們的.NET平臺(tái)拋出的,一種是網(wǎng)站所依賴的宿主拋出的,一般來(lái)講我們所依賴的宿主就是IIS了。
IIS中的錯(cuò)誤頁(yè)入口:

其中的錯(cuò)誤碼想必并不陌生

這里是在服務(wù)器上找不到所需資源時(shí)拋出的錯(cuò)誤頁(yè),在這里可以設(shè)置需要展示的錯(cuò)誤頁(yè)面,只需將預(yù)定的錯(cuò)誤頁(yè)面加入服務(wù)器中,然后在指定狀態(tài)碼下配置路徑即可。
這是請(qǐng)求在IIS中時(shí),還未完全進(jìn)入到asp.net mvc中,這里需要理解什么是未完全進(jìn)入,IIS7+的版本中,不依賴于請(qǐng)求路徑末尾的標(biāo)識(shí)信息,利用mvc中的urlRoutingModule進(jìn)行處理,在我們配置mvc的路由時(shí),首先的第一條:
1 | routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
|
便是隔離非mvc內(nèi)部的使用文件,如果請(qǐng)求的只是服務(wù)器上的文件,那么路由便會(huì)在這里進(jìn)行過(guò)濾,使之不匹配具體路由信息。
也就只是和mvc打了個(gè)招呼 然后就走了,沒(méi)有進(jìn)入mvc中搞事情。
第二種是,進(jìn)入了asp.net mvc的管轄范圍,然后在其中出錯(cuò)了,便是跳到我們?cè)诔绦蛑信渲玫腻e(cuò)誤頁(yè)了。
首先講講我從博友那里學(xué)到的、看到的幾種方式。
第一種是在web.config中通過(guò)customError配置。
1 2 3 | <customErrors mode= "On" defaultRedirect= "~/Error/ErrorPage" >
<error statusCode= "404" redirect= "~/Error/ErrorPage404" />
</customErrors>
|
但是這種方式不怎么令人接受,太過(guò)于簡(jiǎn)單,沒(méi)有一點(diǎn)異常信息,并且有時(shí)候還不能起效果,我不太喜歡這種方式。
這種是用框架封裝好的,利用的是將要說(shuō)的第三種的強(qiáng)大方式實(shí)現(xiàn)的,當(dāng)有異常發(fā)生又沒(méi)得捕獲時(shí),最終利用的第三種方式自動(dòng)實(shí)現(xiàn)。
第二種是利用HandlerErrorAttribute 特性,利用AOP的方式,當(dāng)有異常出現(xiàn)時(shí),便會(huì)進(jìn)入具體實(shí)現(xiàn)了這個(gè)特性的,且被注冊(cè)了的ExceptionAttribute職責(zé)中。
| namespace SAssassin.Web.Core.Filter
{
/// <summary>
/// 異常處理之日志記載采用消息隊(duì)列方式
/// </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);
}
}
}
|
在這里,我可以得到異常信息,也可以解析具體的異常報(bào)錯(cuò)原因,比如404,500... 可以通過(guò)這種形勢(shì),將其轉(zhuǎn)移到不同的自定義錯(cuò)誤頁(yè)面上,此處我增加了一個(gè)控制器
CustomErrorPageController,專門用來(lái)存放錯(cuò)誤頁(yè)面,原有的Shared下的Error.cshtml錯(cuò)誤頁(yè)面也仍然存在著。
我比較喜歡這種方式,一來(lái)可以看到異常信息,而來(lái)可以設(shè)計(jì)需要跳轉(zhuǎn)的錯(cuò)誤頁(yè)面。
第三種方式也是最強(qiáng)大的、俗稱"最后一道防線",從全局層面去捕捉異常的Application_Error
當(dāng)網(wǎng)站初次啟動(dòng)時(shí),會(huì)執(zhí)行一個(gè)特殊的動(dòng)作,Application_start 首先執(zhí)行,也只初始化一次。這個(gè)也是Application 中的事件。
|
public event EventHandler PreSendRequestHeaders;
public event EventHandler MapRequestHandler;
public event EventHandler Disposed;
public event EventHandler BeginRequest;
public event EventHandler AuthenticateRequest;
public event EventHandler PostAuthenticateRequest;
public event EventHandler AuthorizeRequest;
public event EventHandler PostAuthorizeRequest;
public event EventHandler ResolveRequestCache;
-
售前咨詢
售前咨詢服務(wù)時(shí)間:09:00-23:30
售前值班
4006-75-4006
咨詢熱線:
4006-75-4006(09:00-23:30)
0871-6388 6388 (總機(jī))(工作日 09:00-18:00)
-
售后咨詢
售后咨詢服務(wù)時(shí)間:00:00-24:00
24H值班技術(shù)
4006-75-4006
-
備案咨詢
備案咨詢服務(wù)時(shí)間:09:00-18:00(工作日)
備案專業(yè)客服
0871-6388 6388
-
電話
0871-6388 6388 (總機(jī))
- 工單
-
二維碼
-
TOP
|