mvc3: определить, приведет ли URL к выполнению контроллера - PullRequest
1 голос
/ 06 декабря 2011

Я выполняю некоторые задания в моем событии global.asax Application_AcquireRequestState, и я хотел бы выполнить эту работу только , если текущий URL (HttpContext.Current.Request.Url) соответствует любому зарегистрированному маршруту.

На самом деле, я не хочу выполнять код для запросов к изображениям, JavaScript или любому другому файлу.

Поэтому вопрос заключается в следующем: есть ли простой способ проверить данный URL по маршрутам?Коллекция, просто чтобы узнать, соответствует ли она какому-либо маршруту.Мне не нужно знать , какой маршрут совпадает, просто истинное или ложное будет делать эту работу.

Редактировать

Ответ от Archil работает, но почти любойURL соответствует маршруту.Это заставляет меня понять, что мой вопрос не является правильным.Что я хочу, если знать, приведет ли данный URL как-то к выполнению контроллера.Запрос /Content/site.css может соответствовать маршруту, но не будет выполнять контроллер.

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

Что-то в этом роде

void Application_AcquireRequestState(Object sender, EventArgs e)
{
    var httpContextWrapper = new System.Web.HttpContextWrapper(Context);
    bool isMatch = false;

    foreach (var item in RouteTable.Routes)
    {
        if (item.GetRouteData(httpContextWrapper) != null)
        {
            isMatch = true;
            break;
        }
    }
}

Из сводки RouteBase.GetRouteData

//     An object that contains the values from the route definition if the route
//     matches the current request, or null if the route does not match the request.
public abstract RouteData GetRouteData(HttpContextBase httpContext);

UPDATE:

Для фильтрации также по обработчику маршрутов (то есть URL-адресам, которые будут обрабатываться инфраструктурой mvc, а не URL-адресам, соответствующим файлам css и js), я добавил проверку для RouteData.RouteHandler

void Application_AcquireRequestState(Object sender, EventArgs e)
{
    var httpContextWrapper = new System.Web.HttpContextWrapper(Context);
    bool isMatch = false;

    foreach (var item in RouteTable.Routes)
    {
        RouteData routeData = null;
        if ((routeData = item.GetRouteData(httpContextWrapper)) != null && routeData.RouteHandler.GetType().Equals(typeof(MvcRouteHandler)))
        {
            isMatch = true;
            break;
        }
    }
}
1 голос
/ 06 декабря 2011

Я наконец-то нашел что-то работающее:

  private static bool IsRoutedRequest()
  {
     IHttpHandler handler = HttpContext.Current.Handler;
     return handler != null && handler is MvcHandler;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...