C# 如何在应用程序请求中获取RoutedData

C# 如何在应用程序请求中获取RoutedData,c#,asp.net,asp.net-mvc-2,C#,Asp.net,Asp.net Mvc 2,我正在构建一个简单的性能记录器,它与Application\u EndRequest/Application\u BeginRequest 我想将动作和控制器的名称作为某种键发送给我的记录器 如何访问此信息?(如果我必须早些时候截取它并将其保留在上下文中,请不要介意)不确定您是否可以 我翻遍了HttpContext.Current,发现在第二次(以及后续请求)中,HttpContext.Current.Items集合包含System.Web.Routing.UrlRoutingModule.Re

我正在构建一个简单的性能记录器,它与
Application\u EndRequest
/
Application\u BeginRequest

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

如何访问此信息?(如果我必须早些时候截取它并将其保留在上下文中,请不要介意)

不确定您是否可以

我翻遍了
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
{
}

我知道这是一个老问题,但您可以通过以下方式访问所需信息:

HttpContext.Current.Request.RequestContext.RouteData.Values("controller")
HttpContext.Current.Request.RequestContext.RouteData.Values("action")
这是有效的:

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

    }

耶普。。。我们继承了一个基本控制器,因此ActionFilter方法可以工作。顺便说一句,我们已经有了一个
Initialize(RequestContext RequestContext)
的覆盖,所以我将填充它的代码放在那里的上下文中。似乎工作正常。如果我们要更改当前线程中的语言,则它不起作用。(仅在MVC 3中测试…)。您知道我们如何使用路由数据来更改语言吗?
RoutedData.Values
是一个
字典
,它的条目将使用方括号而不是括号提供:
HttpContext.Current.Request.RequestContext.RoutedData.Values[“controller”]
HttpContext.Current.Request.RequestContext.RouteData.Values[“action”]
工作得很好。这就是我要找的。谢谢
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var context = new HttpContextWrapper(HttpContext.Current);
        var rd = RouteTable.Routes.GetRouteData(context);
        // use rd

    }