代码之家  ›  专栏  ›  技术社区  ›  Sam Saffron James Allen

如何在应用程序请求中获得路由数据

  •  6
  • Sam Saffron James Allen  · 技术社区  · 14 年前

    我正在构建一个简单的性能记录器,它可以连接到 Application_EndRequest Application_BeginRequest

    我想给我的记录员发一个 控制器 作为某种钥匙。

    3 回复  |  直到 14 年前
        1
  •  2
  •   PatrickSteele    14 年前

    不确定你能不能。

    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
  •  13
  •   Mike Manard    13 年前

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

    HttpContext.Current.Request.RequestContext.RouteData.Values("controller")
    HttpContext.Current.Request.RequestContext.RouteData.Values("action")
    
        3
  •  1
  •   ʞᴉɯ    6 年前

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            var context = new HttpContextWrapper(HttpContext.Current);
            var rd = RouteTable.Routes.GetRouteData(context);
            // use rd
    
        }
    
        4
  •  0
  •   Alexander Komarov    10 年前
     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;
        }
    
    推荐文章