我正在构建一个简单的性能记录器,它挂钩到Application_EndRequest
/ Application_BeginRequest
我想将我的记录器的操作和控制器的名称作为某种键发送给我。
如何访问此信息? (不要介意我必须在之前拦截它并在上下文中保留它)
答案 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
}