欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2017年11月20日 09:13:15   作者:微笑刺客D  
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC下自定義錯(cuò)誤頁和展示錯(cuò)誤頁的方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

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

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

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

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

這里是在服務(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í),首先的第一條:

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配置。

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

但是這種方式不怎么令人接受,太過于簡(jiǎn)單,沒有一點(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...  可以通過這種形勢(shì),將其轉(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;
    //
    // 摘要:
    //   ASP.NET 將繞過當(dāng)前事件處理程序的執(zhí)行,并允許緩存模塊以處理從緩存請(qǐng)求時(shí)發(fā)生。
    public event EventHandler PostResolveRequestCache;
    //
    // 摘要:
    //   ASP.NET 將內(nèi)容發(fā)送到客戶端之前發(fā)生。
    public event EventHandler PreSendRequestContent;
    //
    // 摘要:
    //   當(dāng) ASP.NET 已映射到相應(yīng)的事件處理程序的當(dāng)前請(qǐng)求時(shí)出現(xiàn)。
    public event EventHandler PostMapRequestHandler;
    //
    // 摘要:
    //   當(dāng) ASP.NET 已完成處理的事件處理程序時(shí)發(fā)生 System.Web.HttpApplication.LogRequest 事件。
    public event EventHandler PostLogRequest;
    //
    // 摘要:
    //   已釋放與請(qǐng)求相關(guān)聯(lián)的托管的對(duì)象時(shí)發(fā)生。
    public event EventHandler RequestCompleted;
    //
    // 摘要:
    //   獲取與當(dāng)前的請(qǐng)求相關(guān)聯(lián)的請(qǐng)求狀態(tài) (例如,會(huì)話狀態(tài)) 時(shí)發(fā)生。
    public event EventHandler PostAcquireRequestState;
    //
    // 摘要:
    //   ASP.NET 開始執(zhí)行事件處理程序 (例如,一個(gè)頁面或 XML Web 服務(wù)) 之前發(fā)生。
    public event EventHandler PreRequestHandlerExecute;
    //
    // 摘要:
    //   當(dāng) ASP.NET 事件處理程序 (例如,一個(gè)頁面或 XML Web 服務(wù)) 完成執(zhí)行時(shí)發(fā)生。
    public event EventHandler PostRequestHandlerExecute;
    //
    // 摘要:
    //   ASP.NET 完成執(zhí)行所有請(qǐng)求事件處理程序后發(fā)生。 此事件會(huì)導(dǎo)致狀態(tài)模塊保存當(dāng)前的狀態(tài)數(shù)據(jù)。
    public event EventHandler ReleaseRequestState;
    //
    // 摘要:
    //   當(dāng) ASP.NET 已完成執(zhí)行所有請(qǐng)求事件處理程序和存儲(chǔ)數(shù)據(jù)的請(qǐng)求狀態(tài)時(shí)發(fā)生。
    public event EventHandler PostReleaseRequestState;
    //
    // 摘要:
    //   當(dāng) ASP.NET 完成執(zhí)行事件處理程序,以便讓緩存模塊存儲(chǔ)將用于為從緩存中的后續(xù)請(qǐng)求提供服務(wù)的響應(yīng)時(shí)發(fā)生。
    public event EventHandler UpdateRequestCache;
    //
    // 摘要:
    //   當(dāng) ASP.NET 完成更新的緩存模塊和存儲(chǔ)用于為從緩存中的后續(xù)請(qǐng)求提供服務(wù)的響應(yīng)時(shí)發(fā)生。
    public event EventHandler PostUpdateRequestCache;
    //
    // 摘要:
    //   ASP.NET 執(zhí)行當(dāng)前請(qǐng)求的任何日志記錄之前發(fā)生。
    public event EventHandler LogRequest;
    //
    // 摘要:
    //   當(dāng) ASP.NET 獲取與當(dāng)前的請(qǐng)求相關(guān)聯(lián)的當(dāng)前狀態(tài) (例如,會(huì)話狀態(tài))。
    public event EventHandler AcquireRequestState;
    //
    // 摘要:
    //   作為執(zhí)行的 HTTP 管道鏈中的最后一個(gè)事件發(fā)生,當(dāng) ASP.NET 的請(qǐng)求做出響應(yīng)。
    public event EventHandler EndRequest;
    //
    // 摘要:
    //   當(dāng)引發(fā)未處理的異常時(shí)發(fā)生。
    public event EventHandler Error;

看到最后一個(gè)事件,當(dāng)引發(fā)未處理的異常時(shí)發(fā)生,便是最后一道防線登場(chǎng)了。如果沒有用aop的方式捕捉異常,那么就是Application _Error登場(chǎng)了。

在Global.asax中我們可以寫上這個(gè)方法

    /// <summary>
    /// 可以完成全局異常處理
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Application_Error(object sender, EventArgs e)
    {
      // 在出現(xiàn)未處理的錯(cuò)誤時(shí)運(yùn)行的代碼
      var error = Server.GetLastError();
      var code = (error is HttpException) ? (error as HttpException).GetHttpCode() : 500;

      //如果不是HttpException記錄錯(cuò)誤信息
      if (code != 404)
      {
        //此處郵件或日志記錄錯(cuò)誤信息
      }

      Response.Write("出錯(cuò)");
      Server.ClearError();

      string path = Request.Path;
      Context.RewritePath(string.Format("~/Errors/Http{0}", code), false);
      IHttpHandler httpHandler = new MvcHttpHandler();
      httpHandler.ProcessRequest(Context);
      Context.RewritePath(path, false);
    }

這個(gè)方法中,我們也可以得到異常信息,記錄日志或是郵件通知,

同樣可以根據(jù)錯(cuò)誤碼進(jìn)行相應(yīng)的跳轉(zhuǎn)錯(cuò)誤頁面。

也可以在當(dāng)前錯(cuò)誤頁面中添加額外的信息。

很是強(qiáng)大。

如果沒有寫這個(gè)方法,則利用框架封裝的默認(rèn)方法。當(dāng)在web.config中配置了customError節(jié)點(diǎn)時(shí),便是這個(gè)方法來幫忙處理。 

或許還有更多更好的方式。望指導(dǎo)指導(dǎo),我想學(xué)習(xí)學(xué)習(xí)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • .net實(shí)現(xiàn)微信公眾賬號(hào)接口開發(fā)實(shí)例代碼

    .net實(shí)現(xiàn)微信公眾賬號(hào)接口開發(fā)實(shí)例代碼

    這篇文章主要介紹了.net實(shí)現(xiàn)微信公眾賬號(hào)接口開發(fā)實(shí)例代碼,有需要的朋友可以參考一下
    2013-12-12
  • ASP.NET生成驗(yàn)證碼的方法

    ASP.NET生成驗(yàn)證碼的方法

    這篇文章主要為大家詳細(xì)介紹了ASP.NET生成驗(yàn)證碼的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • .NET Core 2.0遷移小技巧之MemoryCache問題修復(fù)解決的方法

    .NET Core 2.0遷移小技巧之MemoryCache問題修復(fù)解決的方法

    這篇文章主要給大家介紹了關(guān)于.NET Core 2.0遷移小技巧之MemoryCache問題修復(fù)解決的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • .Net集合排序的一種高級(jí)玩法實(shí)例教程

    .Net集合排序的一種高級(jí)玩法實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于.Net集合排序的一種高級(jí)玩法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • asp.net 圖標(biāo)提取以及圖標(biāo)轉(zhuǎn)換的實(shí)例代碼

    asp.net 圖標(biāo)提取以及圖標(biāo)轉(zhuǎn)換的實(shí)例代碼

    asp.net 圖標(biāo)提取以及圖標(biāo)轉(zhuǎn)換的實(shí)例代碼,需要的朋友可以參考一下
    2013-06-06
  • .Net Core路由處理的知識(shí)點(diǎn)與方法總結(jié)

    .Net Core路由處理的知識(shí)點(diǎn)與方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于.Net Core路由處理的知識(shí)點(diǎn)與方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • ASP.NET MVC 中實(shí)現(xiàn)基于角色的權(quán)限控制的處理方法

    ASP.NET MVC 中實(shí)現(xiàn)基于角色的權(quán)限控制的處理方法

    在ASP.NET MVC中,通過使用其所提供的內(nèi)置
    2013-03-03
  • C# 事件的設(shè)計(jì)與使用深入理解

    C# 事件的設(shè)計(jì)與使用深入理解

    事件是用于通知其他對(duì)象發(fā)生了本對(duì)象發(fā)生了特定的事情的類型成員;事件是.NET類型成員中相對(duì)較為難以理解和實(shí)踐的一個(gè)成員,因?yàn)槭录亩x不是繼承自基礎(chǔ)的數(shù)據(jù)類型,而是對(duì)委托(delegate)的封裝。所以,在了解事件之前,你需要先了解一點(diǎn)委托
    2012-12-12
  • 基于.NET的FluentValidation數(shù)據(jù)驗(yàn)證實(shí)現(xiàn)

    基于.NET的FluentValidation數(shù)據(jù)驗(yàn)證實(shí)現(xiàn)

    這篇文章主要介紹了基于.NET的FluentValidation數(shù)據(jù)驗(yàn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • asp.net SharpZipLib的壓縮與解壓?jiǎn)栴}

    asp.net SharpZipLib的壓縮與解壓?jiǎn)栴}

    關(guān)于SharpZipLib的壓縮與解壓縮的實(shí)現(xiàn)代碼,網(wǎng)絡(luò)上有一堆,千遍一律,連注釋也一模一樣,一模一樣的文章拷來拷去??
    2009-11-11

最新評(píng)論