2010-10-26 21 views
6

Sto costruendo un semplice registratore di prestazioni che si aggancia a Application_EndRequest/Application_BeginRequestCome faccio ad avere RouteData in Application_EndRequest

vorrei inviare il mio logger il nome del azione e regolatore come una sorta di chiave.

Come posso accedere a queste informazioni? (Non importa se devo intercettarlo prima e tenerlo in giro nel contesto)

risposta

2

Non sono sicuro che sia possibile.

Ho individuato lo HttpContext.Current e ho rilevato che nella seconda (e successive richieste), la raccolta HttpContext.Current.Items contiene un'istanza di una classe System.Web.Routing.UrlRoutingModule.RequestData. Sfortunatamente, questa classe è privata quindi non puoi accedere ai suoi dati. Nel debugger, tuttavia, sembra che questo contenga le informazioni che stai cercando (non sono sicuro del motivo per cui non esiste sulla prima richiesta).

In alternativa, è sufficiente utilizzare un filtro azione e aggiungerlo a una classe BaseController derivante da tutti i controller? Qualcosa di simile:

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

quindi creare una classe di controller di base con questo attributo:

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

yerp ... stiamo ereditando da un controller di base in modo che l'approccio ActionFilter funzioni –

+0

btw, abbiamo già avuto una o verride di 'Initialize (RequestContext requestContext)' così ho inserito il codice che lo riempie nel contesto lì. Sembra funzionare bene. –

+0

non funziona se vogliamo cambiare la lingua nel thread corrente. (Testato solo su MVC 3 ...). Hai idea di come possiamo usare i dati del percorso per cambiare la lingua? – Nordes

13

So che questa è una vecchia questione, ma è possibile accedere alle informazioni richieste utilizzando:

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