如何在Application_EndRequest中获取RouteData

时间:2010-10-26 22:44:48

标签: c# asp.net asp.net-mvc-2

我正在构建一个简单的性能记录器,它挂钩到Application_EndRequest / Application_BeginRequest

我想将我的记录器的操作控制器的名称作为某种键发送给我。

如何访问此信息? (不要介意我必须在之前拦截它并在上下文中保留它)

4 个答案:

答案 0 :(得分:13)

我知道这是一个老问题,但您可以使用以下方式访问所请求的信息:

HttpContext.Current.Request.RequestContext.RouteData.Values("controller")
HttpContext.Current.Request.RequestContext.RouteData.Values("action")

答案 1 :(得分: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
{
}

答案 2 :(得分: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;
    }

答案 3 :(得分:0)

这有效:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var context = new HttpContextWrapper(HttpContext.Current);
        var rd = RouteTable.Routes.GetRouteData(context);
        // use rd

    }