2012-05-30 56 views
4

我有一個控制器和動作,這是負責處理403S由於用戶在正確的角色不是。它有權訪問導致異常的原始RequestContext我如何獲取控制器操作的MethodInfo,該操作將在給定請求時被調用?

我想做什麼就能做的是裝飾我的行動與他們所做的事情,然後讓用戶通知他們的經理,請求訪問包含在電子郵件中描述的說明。

那麼,我該如何確定在RequestContext下會有什麼動作呢?

顯然,這是更復雜,越來越控制器和動作名稱出RouteData的,因爲往往有一個動作方法的重載等

一旦我有MethodInfo那麼容易得到的屬性等

回答

2

試圖去解決它回顧有點忌諱的,因爲你可能需要使用反射來發現正確的方法 - 它可能是簡單的插入所需的數據爲HttpContext.Items作爲代碼的一部分授權失敗的地方?然後可以通過您的處理方法通過RequestContext.HttpContext.Items獲得。

+0

值得指出的是'HttpContext.Items'的生命週期是每個請求。存儲在Items Hashtable中的任何信息都會在請求執行後消失。 – Leigh

7

這兒有你的擴展方法。如果您在控制器上進行依賴注入(非參數構造函數),則需要使用反射來枚舉控制器構造函數,或使用IOC容器來實例化控制器,而不是使用Activator.CreateInstance。另外,可以很容易地修改它以像ExceptionContext或HttpContext一樣處理類似的上下文。

public static class RequestContextExtensions 
{ 
    public static MethodInfo GetActionMethod(this RequestContext requestContext) 
    { 
     Type controllerType = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.Name == requestContext.RouteData.Values["controller"].ToString()); 
     ControllerContext controllerContext = new ControllerContext(requestContext, Activator.CreateInstance(controllerType) as ControllerBase); 
     ControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(controllerType); 
     ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, controllerContext.RouteData.Values["action"].ToString()); 
     return (actionDescriptor as ReflectedActionDescriptor).MethodInfo; 
    } 
} 
+0

謝謝!花了整整一個早上試圖弄清楚這一點。爲了其他人的利益,我使用這種方法爲MvcSiteMapProvider的自定義ACL提供程序中的操作獲取自定義屬性。在這種情況下,我可以訪問RequestContext,但不像ActionExecutingContext的完整細節,因爲您會在正常的操作過濾器中獲得該細節。 –

+1

類型名稱通常與路由名稱不同。例如,家庭控制器的類型通常是「HomeController」,它不會與第一次嘗試找到控制器名稱相匹配,這將是'Home' 此外,這忽略了對區域的使用。 –

相關問題