簡體   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