Проверить статический файл во время Application_BeginRequest? - PullRequest
6 голосов
/ 13 июля 2011

У меня есть файл Global.asx, который должен выполнять пользовательскую аутентификацию, аудит и профилирование. Это необходимо, поскольку она поддерживает систему единого входа на основе SAML и должна переопределять обычную аутентификацию .Net (которая не поддерживает ни SAML, ни смешанную аутентификацию)

Я не хочу запускать его для статических файлов, таких как .js, .css, .png и т. Д.

В Cassini / WebDev и IIS7 это так.

Мне нужна простая проверка, например this.Request.IsStaticFile (которая, к сожалению, не существует) для идентификации статических файлов.

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

Мне нужно решение кода, а не изменение конфигурации IIS.

Обновление

Это мой текущий обходной путь:

/// <summary>Hold all the extensions we treat as static</summary>
static HashSet<string> allowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    ".js", ".css", ".png", ...
};

/// <summary>Is this a request for a static file?</summary>
/// <param name="request">The HTTP request instance to extend.</param>
/// <returns>True if the request is for a static file on disk, false otherwise.</returns>
public static bool IsStaticFile(this HttpRequest request)
{
    string fileOnDisk = request.PhysicalPath;
    if (string.IsNullOrEmpty(fileOnDisk))
    {
        return false;
    }

    string extension = Path.GetExtension(fileOnDisk);

    return allowedExtensions.Contains(extension);
}

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

Есть ли лучший способ без изменения конфигурации IIS?

Ответы [ 3 ]

0 голосов
/ 13 июля 2011

Есть несколько вариантов:

  • Добавление authorization элемента и запретить ни один для тех путей, которые не требуют никакой аутентификации и содержат ваши статические файлы
  • Вы используете интегрированный конвейер .Выключите его на своем IIS 7.
0 голосов
/ 13 июля 2011

Нет сомнений в том, что вам нужно создать собственный метод расширения, потому что механизм маршрутизации ASP.NET использует этот код, чтобы решить, существует ли файл,

if (!this.RouteExistingFiles)
{
    string appRelativeCurrentExecutionFilePath = httpContext.Request.AppRelativeCurrentExecutionFilePath;
     if (((appRelativeCurrentExecutionFilePath != "~/") && (this._vpp != null)) && (this._vpp.FileExists(appRelativeCurrentExecutionFilePath) || this._vpp.DirectoryExists(appRelativeCurrentExecutionFilePath)))
     {
          return null;
       }
}

Вы не сможете решить, является ли запрос статическим в Application_BeginRequest, используя context.handler, поскольку модуль маршрутизации может изменить обработчик, и этот модуль всегда выполняется после Application_BeginRequest. Я предлагаю использовать аналогичный код, который использует механизм маршрутизации ASP.NEt.

0 голосов
/ 13 июля 2011

Вы можете проверить, какой обработчик обрабатывает запрос.

В IIS6 только файлы .net, например aspx, сопоставляются с обработчиком, выполняющим все задачи.

В IIS7 с интегрированным конвейером все проходит через .net, что обычно хорошо. Различные обработчики по-прежнему имеют дело с разными типами файлов. В частности, я считаю, что именно staticfilehandler нужно проверять. Свойство httpcontext.handler должно помочь вам понять это.

Вы можете создать метод расширения, чтобы добавить этот метод IsStatic ...

Simon

...