ASP.NET MVC - Какая самая ранняя точка в цикле запросов, где вы можете обнаружить статический запрос на ресурс?

StackOverflow https://stackoverflow.com/questions/6823902

Вопрос

Чтобы задать вопрос некоторого контекста, я написал профилировщик, который вызывается на Application_beginrequest, но он регистрирует все (то есть Javascripts, Images и т. Д.). Хотя в качестве последней среды можно было бы добавить фильтрацию клиента Profiler, я бы предпочел активировать Profiler только тогда, когда можно определить, что запрос требует маршрутизации. В идеале это было бы в Application_beginRequest, но я не думаю, что это было бы возможно без избыточной обработки входящего запроса на маршрутизацию ...

Короче говоря, когда самый ранний точка в жизненном цикле запроса я могу определить, является ли запрос для статического ресурса или нет, и как бы вы это сделали?

Возможно, можно ли вывести или занять или занять в system.web.routing.routeTable и вызвать мой код профилировщика оттуда?

Это было полезно?

Решение 3

Я пытался приблизиться к нему под другим углом и намного счастливее с результатом. В основном - зачем обнаруживать статические запросы на ресурсы, когда вы просто не можете «направить» их вообще? В Global.asax:

private readonly string[] STATIC_CONTENT_PATHS = new string[] { "css", "js", "img" }; 

public static void RegisterRoutes(RouteCollection routes)
{    
    foreach (string path in STATIC_CONTENT_PATHS) { routes.IgnoreRoute(path + @"/{*foo}"); }

    // other MapRoute calls here
}

Теперь мне больше не нужно проверять статические запросы, хотя, если я хочу по какой -либо причине, я все еще могу сделать следующее:

protected void Application_BeginRequest()
{            
    if (IsStaticRequest())
    {
         // do something here
    }
}

private bool IsStaticRequest()
{
   var result = Request.Url.AbsolutePath.Split('/');
   if (result.Length < 2) return false;
   return STATIC_CONTENT_PATHS.Contains(result[1]);
}

Поскольку я знаю с абсолютно, конечно, какие единственные пути я буду служить статическим контентом, это кажется довольно надежным решением. Я все еще открыт для других идей, но я думаю, что это хорошо соответствует моим потребностям.

Другие советы

Есть различные варианты. Во -первых, чтобы определить статический файл с помощью request.physicalPath - Проверьте:Проверьте статический файл во время Application_beginRequest?

Одной из альтернативы было бы иметь это в качестве обработчика и использовать путь, чтобы отметить типы файлов, чтобы включить (*.aspx), например, в web.config. Тогда вы можете иметь доступ к событиям довольно рано (см. Pipeline ASP.NET)

Или просто используйте HTTPModule - проверьте все и только профилируйте нефизические элементы, как вы упоминаете.

Или - используйте свой текущий метод с первой ссылкой, чтобы просто проверить request.physicalPath и надеюсь, что это работает для вас :)

Я бы предпочел использовать MVC Фильтры Для профилирования, поскольку фильтры MVC позволяют добавлять поведение до и после обработки и FilterContext Параметр должен дать вам достаточно информации.

Например, я бы создал ProfilerAttribute для профилирования

public class ProfilerAttribute : FilterAttribute, IActionFilter, IResultFilter, IExceptionFilter {
    public void OnActionExecuting(ActionExecutingContext filterContext) {
        Debug.WriteLine("Before Action is executing");
    }

    public void OnActionExecuted(ActionExecutedContext filterContext) {
        Debug.WriteLine("After Action is executed");
    }

    public void OnResultExecuted(ResultExecutedContext filterContext) {
        Debug.WriteLine("After Action Result is executed");            
    }

    public void OnResultExecuting(ResultExecutingContext filterContext) {
        Debug.WriteLine("Before Action Result is executing");
    }

    public void OnException(ExceptionContext filterContext) {
        Debug.WriteLine("oops! exception");
    }
}

и зарегистрироваться как Globalfilter в Global.ascx....

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new HandleErrorAttribute());
    filters.Add(new ProfilerAttribute());
}

Надеюсь, это может помочь. Спасибо.

Обновить: Забыл упомянуть, что фильтр MVC выполнил только после Маршрутизация сопоставлена. Таким образом, вам не нужно фильтровать статические ресурсы, так как это уже было сделано MVC.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top