Как получить RouteData в Application_EndRequest - PullRequest
6 голосов
/ 27 октября 2010

Я создаю простой регистратор производительности, который подключается к Application_EndRequest / Application_BeginRequest

Я хотел бы отправить моему регистратору имя контроллера action и как какой-то ключ.

Как я могу получить доступ к этой информации?(Не против, если мне придется перехватить это раньше и держать в контексте)

Ответы [ 4 ]

13 голосов
/ 23 февраля 2012

Я знаю, что это старый вопрос, но вы можете получить доступ к запрашиваемой информации, используя:

2 голосов
/ 27 октября 2010

Не уверен, что вы можете.

Я обошел вокруг 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
{
}
0 голосов
/ 03 июня 2019

Это работает:

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

    }
0 голосов
/ 27 мая 2015
 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...