1. 程式人生 > >ASP.NET MVC下基於異常處理的完整解決方案

ASP.NET MVC下基於異常處理的完整解決方案

EntLib的異常處理應用塊(Exception Handling Application Block)是一個不錯的異常處理框架,它使我們可以採用配置的方式來定義異常處理策略。而ASP.NET MVC是一個極具可擴充套件開發框架,在這篇文章中我將通過它的擴充套件實現與EntLib的整合,並提供一個完整的解決異常處理解決方案。[原始碼從這裡下載]

目錄
一、基本異常處理策略
二、通過自定義Action處理異常
三、通過配置的Error View處理異常
四、自定義ActionInvoker:ExceptionActionInvoker
五、自定義Controller:BaseController

一、基本異常處理策略

我們首先來討論我們的解決方案具體採用的異常處理策略:

  • 對於執行Controller的某個Action方法丟擲的異常,我們會按照指定配置策略進行處理。我們可以採取日誌記錄、異常替換和封裝這些常用的異常處理方式;
  • 對於處理後的異常,如果異常處理策略規定需要將其丟擲,則會自動重定向到與異常型別匹配的出錯頁面。我們會維護一個異常型別和Error View的匹配關係;
  • 對於處理後的異常,如果異常處理策略規定需要將其丟擲,則會執行與當前Action操作相匹配的錯誤處理Action進行處理。異常處理Action方法預設採用“On{Action}Error”這樣的命名規則,而當前上下文會與異常處理操作方法的引數進行繫結。除次之外,我們會設定當前ModelState的錯誤資訊;
  • 如果使用者不曾定義相應的異常處理Action,依然採用“錯誤頁面重定向”方式進行異常處理。

二、通過自定義Action處理異常

為了讓讀者對上面介紹的異常處理頁面有一個深刻的理解,我們來進行一個例項演示。該例項用於模擬使用者登入,我們定義瞭如下一個只包含使用者名稱和密碼兩個屬性的Model:LoginInfoModel。

   1: namespace Artech.Mvc.ExceptionHandling.Models
   2: {
   3:     public class LoginInfo
   4:     {
   5:         [Display(Name ="User Name"
)]
   6:         [Required(ErrorMessage = "User Name is manadatory!")]
   7:         public string UserName { get; set; }
   8:  
   9:         [Display(Name = "Password")]
  10:         [DataType(DataType.Password)]
  11:         [Required(ErrorMessage = "Password is manadatory!")]
  12:         public string Password { get; set; }
  13:     }
  14: }

我們定義瞭如下一個AccountController,它是我們自定義的BaseController的子類。AccountController在構造的時候呼叫基類建構函式指定的引數代表異常處理策略的配置名稱。SignIn方法代表用於進行“登入”的操作,而OnSignInError就表示該操作對應的異常處理操作。如果在SignIn操作中丟擲的異常經過處理後無需再丟擲,則會通過呼叫OnSignInError,而此時ModelState已經被設定了相應的錯誤訊息。

   1: public class AccountController : BaseController
   2: {
   3:     public AccountController()
   4:         : base("myPolicy")
   5:     { }
   6:  
   7:     public ActionResult SignIn()
   8:     {
   9:         return View(new LoginInfo());
  10:     }
  11:     [HttpPost]
  12:     public ActionResult SignIn(LoginInfo loginInfo)
  13:     {
  14:         if (!ModelState.IsValid)
  15:         {
  16:             return this.View(new LoginInfo { UserName = loginInfo.UserName });
  17:         }
  18:  
  19:         if (loginInfo.UserName != "Foo")
  20:         {
  21:             throw new InvalidUserNameException();
  22:         }
  23:  
  24:         if (loginInfo.Password != "password")
  25:         {
  26:             throw new UserNamePasswordNotMatchException();
  27:         }
  28:  
  29:         ViewBag.Message = "Authentication Succeeds!";
  30:         return this.View(new LoginInfo { UserName = loginInfo.UserName });
  31:     }
  32:  
  33:     public ActionResult OnSignInError(string userName)
  34:     {
  35:         return this.View(new LoginInfo { UserName = userName });
  36:     }
  37: }

具體定義在SignIn操作方法中的認證邏輯是這樣的:如果使用者名稱不是“Foo”則丟擲InvalidUserNameException異常;如果密碼不是“password”則丟擲UserNamePasswordNotMatchException異常。下面是SignIn操作對應的View的定義:

   1: @model Artech.Mvc.ExceptionHandling.Models.LoginInfo
   2: @{
   3:     ViewBag.Title = "SignIn";
   4: }
   5: @Html.ValidationSummary()
   6: @if (ViewBag.Messages != null)
   7: { 
   8:     @ViewBag.Messages
   9: }
  10: @using (Html.BeginForm())
  11: { 
  12:     @Html.EditorForModel()
  13:     <input type="submit" value="SignIn" />
  14: }

在AccountController初始化時指定的異常處理策略“myPolicy”定義在如下的配置中。我們專門針對SignIn操作方法丟擲的InvalidUserNameException和UserNamePasswordNotMatchException進行了處理,而ErrorMessageSettingHandler是我們自定義的異常處理器,它僅僅用於設定錯誤訊息。如下面的程式碼片斷所示,如果上述的這兩種型別的異常被丟擲,最終的錯誤訊息會被指定為“User name does not exist!”和“User name does not match password!”。

   1: <exceptionHandling>
   2:   <exceptionPolicies>
   3:     <add name="myPolicy">
   4:       <exceptionTypes>
   5:         <add name="InvalidUserNameException" 
   6:                type="Artech.Mvc.ExceptionHandling.Models.InvalidUserNameException, Artech.Mvc.ExceptionHandling"
   7:              postHandlingAction="None">
   8:           <exceptionHandlers>
   9:             <add name="ErrorMessageSettingHandler"
  10:                  type="Artech.Mvc.ExceptionHandling.ErrorMessageSettingHandler, Artech.Mvc.ExceptionHandling"
  11:                  errorMessage="User name does not exist!"/>
  12:           </exceptionHandlers>
  13:         </add>
  14:         <add name="UserNamePasswordNotMatchException" 
  15:                type="Artech.Mvc.ExceptionHandling.Models.UserNamePasswordNotMatchException, Artech.Mvc.ExceptionHandling"
  16:              postHandlingAction="None">
  17:           <exceptionHandlers>
  18:             <add name="ErrorMessageSettingHandler"
  19:                  type="Artech.Mvc.ExceptionHandling.ErrorMessageSettingHandler, Artech.Mvc.ExceptionHandling"
  20:                  errorMessage="User name does not match password!"/>
  21:           </exceptionHandlers>
  22:         </add>          
  23:       </exceptionTypes>
  24:     </add>
  25:   </exceptionPolicies>
  26: </exceptionHandling>

現在我們通過路由對映將AccountController和Sign設定為預設Controller和Action後,開啟我們的應用程式。在輸入錯誤的使用者名稱和錯誤明碼的情況下在ValidationSummary中將自動得到相應的錯誤訊息。

image

三、通過配置的Error View處理異常

在上面的配置中,針對InvalidUserNameException和UserNamePasswordNotMatchException這兩種異常型別的配置策略都將PostHandlingAction屬性設定為“None”,意味著不會將原來的異常和處理後的異常進行重新丟擲。現在我們將該屬性設定為“ThrowNewException”,意味著我們會將處理後的異常重新丟擲來。

   1: <exceptionHandling>
   2:   <exceptionPolicies>
   3:     <add name="myPolicy">
   4:       <exceptionTypes>
   5:         <add name="InvalidUserNameException" type="Artech.Mvc.ExceptionHandling.Models.InvalidUserNameException, Artech.Mvc.ExceptionHandling"
   6:              postHandlingAction="ThrowNewException">
   7:          ...
   8:         <add name="UserNamePasswordNotMatchException" 
            
           

相關推薦

ASP.NET MVC基於異常處理完整解決方案

EntLib的異常處理應用塊(Exception Handling Application Block)是一個不錯的異常處理框架,它使我們可以採用配置的方式來定義異常處理策略。而ASP.NET MVC是一個極具可擴充套件開發框架,在這篇文章中我將通過它的擴充套件實現與

ASP.NET MVC使用Exception過濾器處理異常

ASP.NET MVC使用Exception過濾器處理異常,Exception過濾器只在另一個過濾器、動作方法、動作結果彈出異常時執行。 示例:使用Exception過濾器處理異常資訊。 建立MyHandleErrorAttribute類,繼承HandleErrorAttribute類:

Asp.net MVC Session過期異常處理

一, Session引發的異常 小趙剛進公司,就參與到了一個實際的專案中了,專案使用的是Asp.net MVC。花了大概2個周的時間,小趙就完成了所有功能,提交給QA測試了。 過了一天,QA發回了測試結果,小趙過了一遍,發現原來自己做的東西,裡面問題這麼多。 其中一

Asp.net mvc 載文件

設置 var value public ppa response oot turn cat 前言 最近有需求需要下載文件,可能是image的圖片,也可能是pdf報告,也可能是微軟的word或者excel文件。 這裏就整理了asp.net mvc 和asp.net web

ASP.NET MVC的異步Action的定義和執行原理

urn des {0} 不同 exce .class 遠程 是否 了解 Visual Studio提供的Controller創建向導默認為我們創建一個繼承自抽象類Controller的Controller類型,這樣的Controller只能定義同步Action方法。如果我們

ASP.NET MVC判斷基於Cookie的Session過期

new pac direct net ttr container att thum tpc 當我們第一次請求訪問時,可以看到Response的Set-Cookie裏添加了ASP.NET_SessionId的值,以後再訪問時可以看到Resquest裏的Cookie已經包含這個

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

提供服務 one url attribute 運行 16px execute 釋放 namespace 在網站運行中,錯誤是不可避免的,錯誤頁的產生也是不可缺少的。 這幾天看了博友的很多文章,自己想總結下我從中學到的和實際中配置的。 首先,需要知道產生錯誤頁的來源,一種

ASP.NET MVC編程——錯誤處理與日記

CP 引用 args context mvc4 strong gpo pub family ASP.NET MVC的錯誤處理應考慮到這幾個方面:模型綁定期間發生的錯誤,未能路由到指定操作,針對控制器的錯誤處理。使用配置文件可以幫助我們處理異常,但是不夠靈活和全面;使用Han

ASP.NET MVC拉框聯動

這個case主要是我在做專案的時候遇到一個需要根據input控制元件輸入的內容,動態填充dropdown list中的內容, 實現二者聯動的需求。在搜尋了一些資源後,這篇部落格解決了我的問題,所以記錄並轉載一下。 轉載自: https://www.jb51.net/article/88986.htm 資料

ASP.NET MVC使用Action過濾器處理方法

Action過濾器在動作方法之前及之後執行,Result過濾器在動作結果被執行之前和之後執行。 1、Action過濾器 在ASP.NET MVC中建立MvcApp專案,建立資料夾Filter,然後新建類MyActionFilterAttribute(為了遵循預設的約定,名稱以Attrib

ASP.NET MVC 自定義模型繫結,去除字串型別前後的空格

直接貼程式碼了: SkyModelBinder.cs using System.ComponentModel; using System.Linq; using System.Web.Mvc; namespace MvcSample.Extensions { public cl

ASP.NET MVC Controller過濾器預處理表單資料

Filter Atttribute: using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; usin

ASP.NET MVC通過JQuery$.ajax提交資料,控制器接收資料

今天在實現一個小功能時,這個是一個彈出的模態框,然後點選儲存的時候,通過Ajax將文字框中的內容傳到後臺控制器,控制器執行相應的操作,在將內容儲存到資料庫。然後問題就出在用Ajax傳到控制器的時候,控制器接收不到引數。因為寫MVC也比較少,這方面不是很會,所以還是記錄一下。一

ASP.NET MVC 拉框的傳值的兩種方式

        以前使用WebForm變成時,下拉框傳值只需直接在後臺繫結程式碼就可以了。現在我們來看看在MVC中DropDownList是如果和接受從Controller傳過來的值的。 第一種:使用DropDownList     控制器程式碼: p

asp.net core 自定義異常處理中介軟體

asp.net core 自定義異常處理中介軟體 Intro 在 asp.net core 中全域性異常處理,有時候可能不能滿足我們的需要,可能就需要自己自定義一箇中間件處理了,最近遇到一個問題,有一些異常,不希望記錄錯誤日誌,目前主要是使用者請求取消導致的 TaskCanceledException 和 O

IIS+Asp.Net Mvc必須知道的事(解決啟動/重啟/自動回收站點後第一次訪問慢問題)

問題現象: Asp.net Mvc站點部署在IIS上後,第一個使用者第一次訪問站點,都會比較慢,確切的說是訪問站點的Action頁面(即非靜態頁面,因為靜態頁面直接由IIS處理返回給使用者即完成請求,而Action頁面IIS要轉交給Aspnet_Wp工作程序,進而涉及相關初

讓Windows Server 2008 + IIS 7+ ASP.NET 支援10萬併發請求--手動解決方案(轉載)

今天下午17點左右,部落格園部落格站點出現這樣的錯誤資訊: Error Summary: HTTP Error 503.2 - Service Unavailable The [email protected] setting is being exceeded. 

asp.net 中 DropDownList 加入可輸入功能解決方案

先把這段JS程式碼放到你頁面的HTML中去 function catch_keydown(sel) { switch(event.keyCode) { case 13: //Enter; sel.options[sel.length] = new Option("",

Asp.net utf-8 編碼中文亂碼完全解決方案

 Unicode 編碼正逐漸成為多語言支援的最通用解決方案。採用 Unicode 編碼的中文網頁能在各種平臺、各種類的瀏覽器上都得到很好的相容。utf-8 是 Unicode 的一種儲存/交換實現方式。對於不同數值範圍的 Unicode 碼,它採用變長的方式來編碼:所有

asp.net(c#)全新BS架構考勤完美解決方案

他能解決哪些問題? 1、考勤地分散在各個城市,甚至全球,希望總部統一管控 2、領匯出差,在家,隨時想檢視員工的出勤狀況 3、無法提供上網的複雜環境 4、公司班車需要員工刷指紋(或刷臉或指靜脈或掌紋或ID卡等) 5、員工自助查詢:做為請假、調休等依據,結果更公正透明 6、考勤