ASP.NET MVC - Какая самая ранняя точка в цикле запросов, где вы можете обнаружить статический запрос на ресурс?
-
26-10-2019 - |
Вопрос
Чтобы задать вопрос некоторого контекста, я написал профилировщик, который вызывается на 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.