繁体   English   中英

如何在Application_EndRequest中获取RouteData

[英]How do I get RouteData in Application_EndRequest

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

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

我该如何获取这些信息? (不要介意我是否必须早些拦截它并在上下文中保留它)

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

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

不确定是否可以。

我戳了一下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
{
}

这正在工作:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM