2010-10-26 4 views
6

Я строй простого регистратор производительности, перехватывает и Application_EndRequest/Application_BeginRequestКак получить RouteData в Application_EndRequest

Я хотел бы послать мой регистратор имя из действий и контроллера как своего рода ключ.

Как получить доступ к этой информации? (Не возражайте, если я должен перехватить его раньше и сохранить его в контексте)

ответ

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 работает –

+0

Кстати, у нас уже было o verride of «Инициализировать (RequestContext requestContext)», поэтому я поместил код, который хранит его в контексте. Кажется, хорошо работает. –

+0

не работает, если мы хотим изменить язык в текущем потоке. (Проверено только в MVC 3 ...). Вы знаете, как мы можем использовать данные маршрута для изменения языка? – Nordes

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; 
    }