Как проверить текущий ресурс запроса - это страница в С# ASP.NET?

У меня есть реализация IHttpModule с делегированным методом, привязанным к PostAcquireRequestState, для каждого HTTP-запроса я хотел бы знать , как проверить, является ли текущий запрошенный ресурс страницей (aspx) распознавание всех других ресурсов, таких как *.css, *.ico, *.png и т.д.

На самом деле я могу сделать следующее:

private static void OnPostAcquireRequestState(object sender, EventArgs e)
{
  bool isPage = HttpContext.Current.Request.Path.EndsWith(".aspx");
}

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

Ответ 1

Одна вещь, которую вы можете сделать, - это получить список зарегистрированных HTTP-обработчиков и проверить, обрабатывается ли они системным классом. Предполагая, что вы не называете свои собственные классы в пространстве имен System.*, это довольно безопасно:

using System.Configuration;
using System.Web.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
HttpHandlersSection handlers = (HttpHandlersSection) config
                               .GetSection("system.web/httpHandlers");

List<string> forbiddenList = new List<string>();

// next part untested:
foreach(HttpHandlerAction handler in handlers.Handlers)
{
    if(handler.Type.StartsWith("System."))
    {
        forbiddenList.Add(handler.Path);
    }
}

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


Примечание: обычно проще сделать обратное. Кажется, вы хотите, чтобы в черный список попали несколько путей, но вместо этого, если вы можете сделать белый список (т.е. Составить список тех расширений, которые вы хотите обработать), вы можете сделать это самим намного проще.