2010-10-26 120 views
6

我建立掛接到Application_EndRequest/Application_BeginRequest我怎麼做Application_EndRequest

我想作爲某種送我的記錄器的名稱行動控制器的一個簡單的性能記錄器獲得的RouteData鍵。

我該如何獲得這些信息? (不要介意,如果我必須早一點攔截它並在上下文中保留它)

回答

2

不確定你可以。

我戳了HttpContext.Current,發現在第二個(和後續的請求),HttpContext.Current.Items集合包含一個System.Web.Routing.UrlRoutingModule.RequestData類的實例。不幸的是,這個類是私人的,所以你不能訪問它的數據。但是,在調試器中,它似乎包含您正在查找的信息(不確定爲什麼它在第一個請求上不存在)。

另外,你可以只使用一個動作過濾器,並將其添加到所有控制器派生自的BaseController類?喜歡的東西:

public class LoggingActionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 
     var controllerName = filterContext.Controller.ControllerContext.RouteData.Values["controller"]; 
     var actionName = filterContext.Controller.ControllerContext.RouteData.Values["action"]; 
    } 
} 

然後創建一個基本的控制器類與此屬性:

[LoggingAction] 
public abstract class BaseController : Controller 
{ 
} 
+0

yerp ...我們繼承了一個基礎控制器,所以ActionFilter方法工作 – 2010-10-27 01:25:48

+0

順便說一句,我們已經有一個o verride'Initialize(RequestContext requestContext)',所以我放置了代碼將其填充到上下文中。似乎工作正常。 – 2010-10-27 05:38:39

+0

如果我們想要改變當前線程中的語言,它不起作用。 (僅在MVC 3中測試...)。你知道我們如何使用路線數據來改變語言嗎? – Nordes 2010-11-20 19:17:40

13

我知道這是一個老問題,但可以使用訪問請求的信息:

HttpContext.Current.Request.RequestContext.RouteData.Values("controller") 
HttpContext.Current.Request.RequestContext.RouteData.Values("action") 
0
object GetControllerFromContext(HttpContext context) { 
     object controller = null; 
     HttpContextBase currentContext = new HttpContextWrapper(context); 
     UrlHelper urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
     RouteData routeData = urlHelper.RouteCollection.GetRouteData(currentContext); 
     if(routeData != null) { 
      controller = routeData.Values["controller"]; 
     } 
     return controller; 
    }