程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC集成EntLib實現“自動化”異常處理[實現篇]

ASP.NET MVC集成EntLib實現“自動化”異常處理[實現篇]

編輯:關於ASP.NET

通過《實例篇》的實演示可以看出我們通過擴展實現的自動異常處理機制能夠 利用EntLib的EHAB根據執行的一場處理策略對某個Action方法執行過程中拋出的 異常進行處理。對於處理後的結果,則按照如下的機制對請求進行響應。[源代碼 從這裡下載]

對於Ajax請求,直接創建一個用於封裝被處理後異常的數據對象,並據此創建 一個JsonResult將異常信息回復給客戶端。

對於非Ajax請求,如果當前Action方法上應用HandleErrorActionAttribute特 性設置了匹配的Action方法用於處理該方法拋出的異常,那麼執行該方法並用返 回的ActionResult對象響應當前請求。

如果HandleErrorActionAttribute特性不曾應用在當前Action方法上,或者通 過該特性指定的Action不存在,則將默認的錯誤View呈現出來作為多請求的響應 。

一、ExceptionPolicyAttribute & HandleErrorActionAttribute

所有的這些都是通過一個自定義的ExceptionFilter來實現的。不過我們並沒 有定義任何的ExceptionFilter特性,而是將異常處理實現在一個自定義的 ExtendedController基類中,對異常的自動處理實現在重寫的OnException方法中 ,不過在介紹該方法的邏輯之前我們先來看看定義在ExtendedController中的其 他輔助成員。

   1: public class ExtendedController: Controller
2: {
3: private static Dictionary<Type, ControllerDescriptor> controllerDescriptors = new Dictionary<Type, ControllerDescriptor>();
4: private static object syncHelper = new object();
5:
6: protected override void OnException(ExceptionContext filterContext)
7: {
8: //省略成員
9: }
10:
11: //描述當前Controller的ControllerDescriptor
12: public ControllerDescriptor Descriptor
13: {
14: get
15: {
16: ControllerDescriptor descriptor;
17: if(controllerDescriptors.TryGetValue(this.GetType(), out descriptor))
18: {
19: return descriptor;
20: }
21: lock (syncHelper)
22: {
23: if (controllerDescriptors.TryGetValue(this.GetType(), out descriptor))
24: {
25: return descriptor;
26: }
27: else
28: {
29: descriptor = new ReflectedControllerDescriptor(this.GetType());
30: controllerDescriptors.Add(this.GetType(), descriptor);
31: return descriptor;
32: }
33: }
34: }
35: }
36: //獲取異常處理策略名稱
37: public string GetExceptionPolicyName()
38: {
39: string actionName = ControllerContext.RouteData.GetRequiredString("action");
40: ActionDescriptor actionDescriptor = this.Descriptor.FindAction(ControllerContext, actionName);
41: if (null == actionDescriptor)
42: {
43: return string.Empty;
44: }
45: ExceptionPolicyAttribute exceptionPolicyAttribute = actionDescriptor.GetCustomAttributes(true).OfType<ExceptionPolicyAttribute>().FirstOrDefault()??
46: Descriptor.GetCustomAttributes(true).OfType<ExceptionPolicyAttribute>().FirstOrDefault()?? new ExceptionPolicyAttribute("");
47: return exceptionPolicyAttribute.ExceptionPolicyName;
48: }
49:
50: //獲取Handle-Error-Action名稱
51: public string GetHandleErrorActionName()
52: {
53: string actionName = ControllerContext.RouteData.GetRequiredString("action");
54: ActionDescriptor actionDescriptor = this.Descriptor.FindAction(ControllerContext, actionName);
55: if (null == actionDescriptor)
56: {
57: return string.Empty;
58: }
59: HandleErrorActionAttribute handleErrorActionAttribute = actionDescriptor.GetCustomAttributes(true).OfType<HandleErrorActionAttribute>().FirstOrDefault()??
60: Descriptor.GetCustomAttributes(true).OfType<HandleErrorActionAttribute>().FirstOrDefault()?? new HandleErrorActionAttribute("");
61: return handleErrorActionAttribute.HandleErrorAction;
62: }
63:
64: //用於執行Handle-Error-Action的ActionInvoker
65: public HandleErrorActionInvoker HandleErrorActionInvoker { get; private set; }
66:
67: public ExtendedController()
68: {
69: this.HandleErrorActionInvoker = new HandleErrorActionInvoker();
70: }
71: }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved