ASP.NET MVC的錯誤處理應考慮到這幾個方面:模型綁定期間發生的錯誤,未能路由到指定操作,針對控制器的錯誤處理。使用配置文件可以幫助我們處理異常,但是不夠靈活和全面;使用HandleErrorAttribute、自定義錯誤過濾器或重寫控制器OnException方法只能解決針對控制器的錯誤,無法解決模型綁定期間發生的錯誤,也無法處理404錯誤,即使將錯誤過濾器注冊為全局過濾器也是如此。有時候需要多種方法配合使用。
在捕獲錯誤的地方,可以將有用的信息記錄下來,便于我們查出引起問題的原因和糾正錯誤。
1啟用自定義錯誤
使用這種方式一定要注意將defaultRedirect設置為指定的錯誤頁面,防止黑客探測各種錯誤情形進而發現系統的額漏洞。
<system.web> <customErrors mode="On" defaultRedirect="/error/error2"> <error statusCode="404" redirect="/error/error1" /> </customErrors> <!--其他配置--></system.web>
Mode:處理模式,有三種處理模式
On,啟用自定義處理功能,當錯誤發生時顯示自定義錯誤頁 Off,關閉自定義錯誤處理功能,當錯誤發生時顯示默認的錯誤頁。 RemoteOnly,啟用自定義錯誤處理功能,但只針對來自遠程機器的請求有效。defaultRedirect:發生錯誤時,顯示指定錯誤頁。
<error>:根據狀態碼顯示指定的錯誤頁。mode必須為On或RemoteOnly模式,否則不會起作用。
注意:不論defaultRedirect和redirect都配置為指定的路徑,例如上述配置中控制器error,控制器操作為error1和error2,相應地錯誤頁為Error1.cshtml和Error2.cshtml。
2針對控制器的錯誤處理
2.1使用HandleErrorAttribute修飾控制器或操作。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]public class HandleErrorAttribute : FilterAttribute, IExceptionFilter{ //獲取或設置異常的類型。 public Type ExceptionType { get; set; } //獲取或設置用于顯示異常信息的母版視圖 public string Master { get; set; } //獲取此特性的唯一標識符。 public override object TypeId { get; } //獲取或設置用于顯示異常信息的頁視圖。 public string View { get; set; } //在發生異常時調用。 //filterContext:操作篩選器上下文 public virtual void OnException(ExceptionContext filterContext);}例:
當發生KeyNotFoundException類型的異常時,顯示KeyNotFind視圖
[HandleError(ExceptionType=typeof(KeyNotFoundException),View="KeyNotFound")]public ActionResult Index(){ ......}還可以使用自定義的錯誤過濾器,并將其應用到控制器或操作上。
例:
public class CustomHandleError : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (filterContext==null) base.OnException(filterContext); //記錄日志 LogError(filterContext.Exception); //判斷是否啟用了自定義錯誤 if (filterContext.HttpContext.IsCustomErrorEnabled) { //將錯誤設置為已處理 filterContext.ExceptionHandled = true; base.OnException(filterContext); } } }
新聞熱點
疑難解答
圖片精選