日本三级片在线观看视频_西西大胆午夜人体视频无码_少妇无码一区二区_亚洲天堂超碰_极品少妇被猛的白浆直流_91精品云霸高清中文字幕_草草五月天伊人_久久少妇无码专区_欧美激欧美啪啪5老太_日韩在线在线成人

幫助中心 >  技術(shù)知識(shí)庫 >  網(wǎng)站相關(guān) >  網(wǎng)站運(yùn)營 >  ASP.NET MVC下自定義錯(cuò)誤頁和展示錯(cuò)誤頁的方式

ASP.NET MVC下自定義錯(cuò)誤頁和展示錯(cuò)誤頁的方式

2017-12-13 15:30:08 3667

ASP.NET MVC下自定義錯(cuò)誤頁和展示錯(cuò)誤頁的方式

在網(wǎng)站運(yùn)行中,錯(cuò)誤是不可避免的,錯(cuò)誤頁的產(chǎn)生也是不可缺少的。

這幾天看了博友的很多文章,自己想總結(jié)下我從中學(xué)到的和實(shí)際中配置的。

首先,需要知道產(chǎn)生錯(cuò)誤頁的來源,一種是我們的.NET平臺(tái)拋出的,一種是網(wǎng)站所依賴的宿主拋出的,一般來講我們所依賴的宿主就是IIS了。

IIS中的錯(cuò)誤頁入口:

201711200927211.png

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

201711200927212.png

這里是在服務(wù)器上找不到所需資源時(shí)拋出的錯(cuò)誤頁,在這里可以設(shè)置需要展示的錯(cuò)誤頁面,只需將預(yù)定的錯(cuò)誤頁面加入服務(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)行過濾,使之不匹配具體路由信息。

也就只是和mvc打了個(gè)招呼 然后就走了,沒有進(jìn)入mvc中搞事情。 

第二種是,進(jìn)入了asp.net mvc的管轄范圍,然后在其中出錯(cuò)了,便是跳到我們?cè)诔绦蛑信渲玫腻e(cuò)誤頁了。 

首先講講我從博友那里學(xué)到的、看到的幾種方式。

第一種是在web.config中通過customError配置。

1
2
3
<customErrors mode="On" defaultRedirect="~/Error/ErrorPage">
   <error statusCode="404" redirect="~/Error/ErrorPage404" />
</customErrors>

但是這種方式不怎么令人接受,太過于簡單,沒有一點(diǎn)異常信息,并且有時(shí)候還不能起效果,我不太喜歡這種方式。

這種是用框架封裝好的,利用的是將要說的第三種的強(qiáng)大方式實(shí)現(xiàn)的,當(dāng)有異常發(fā)生又沒得捕獲時(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...  可以通過這種形勢,將其轉(zhuǎn)移到不同的自定義錯(cuò)誤頁面上,此處我增加了一個(gè)控制器

CustomErrorPageController,專門用來存放錯(cuò)誤頁面,原有的Shared下的Error.cshtml錯(cuò)誤頁面也仍然存在著。

我比較喜歡這種方式,一來可以看到異常信息,而來可以設(shè)計(jì)需要跳轉(zhuǎn)的錯(cuò)誤頁面。

第三種方式也是最強(qiáng)大的、俗稱"最后一道防線",從全局層面去捕捉異常的Application_Error

當(dāng)網(wǎng)站初次啟動(dòng)時(shí),會(huì)執(zhí)行一個(gè)特殊的動(dòng)作,Application_start 首先執(zhí)行,也只初始化一次。這個(gè)也是Application 中的事件。


    //
        // 摘要:
        //   ASP.NET 將 HTTP 標(biāo)頭發(fā)送到客戶端之前發(fā)生。
        public event EventHandler PreSendRequestHeaders;
        //
        // 摘要:
        //   在選擇該處理程序?qū)φ?qǐng)求作出響應(yīng)時(shí)發(fā)生。
        public event EventHandler MapRequestHandler;
        //
        // 摘要:
        //   釋放應(yīng)用程序時(shí)發(fā)生。
        public event EventHandler Disposed;
        //
        // 摘要:
        //   作為執(zhí)行的 HTTP 管道鏈中的第一個(gè)事件發(fā)生,當(dāng) ASP.NET 的請(qǐng)求做出響應(yīng)。
        public event EventHandler BeginRequest;
        //
        // 摘要:
        //   當(dāng)安全模塊已建立的用戶標(biāo)識(shí)時(shí)出現(xiàn)。
        public event EventHandler AuthenticateRequest;
        //
        // 摘要:
        //   當(dāng)安全模塊已建立的用戶標(biāo)識(shí)時(shí)出現(xiàn)。
        public event EventHandler PostAuthenticateRequest;
        //
        // 摘要:
        //   安全模塊已驗(yàn)證用戶身份驗(yàn)證時(shí)發(fā)生。
        public event EventHandler AuthorizeRequest;
        //
        // 摘要:
        //   當(dāng)前請(qǐng)求的用戶已被授權(quán)時(shí)發(fā)生。
        public event EventHandler PostAuthorizeRequest;
        //
        // 摘要:
        //   當(dāng) ASP.NET 完成授權(quán)事件以便從緩存中,跳過的事件處理程序 (例如,一個(gè)頁面或 XML Web 服務(wù)) 執(zhí)行的請(qǐng)求提供服務(wù)的緩存模塊時(shí)發(fā)生。
        public event EventHandler ResolveRequestCache;
        

    提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

    這條文檔是否有幫助解決問題?

    非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

    在文檔使用中是否遇到以下問題: