手机看片精品高清国产日韩,色先锋资源综合网,国产哺乳奶水91在线播放,乱伦小说亚洲色图欧洲电影

幫助中心 >  技術知識庫 >  網站相關 >  網站運營 >  ASP.NET MVC下自定義錯誤頁和展示錯誤頁的方式

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

2017-12-13 15:30:08 9895

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

在網站運行中,錯誤是不可避免的,錯誤頁的產生也是不可缺少的。

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

首先,需要知道產生錯誤頁的來源,一種是我們的.NET平臺拋出的,一種是網站所依賴的宿主拋出的,一般來講我們所依賴的宿主就是IIS了。

IIS中的錯誤頁入口:

201711200927211.png

其中的錯誤碼想必并不陌生

201711200927212.png

這里是在服務器上找不到所需資源時拋出的錯誤頁,在這里可以設置需要展示的錯誤頁面,只需將預定的錯誤頁面加入服務器中,然后在指定狀態碼下配置路徑即可。

這是請求在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;
          

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

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

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

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