Подход с использованием фронт-контроллера и IIS, обслуживающих статические файлы?

Фон

Фильтр IIS ISAPI направляет все запросы на фронт-контроллер Java CMS для ответа. Данному URL-адресу не соответствует ни один физический файл. Мотивы:

  1. Защита URL-адресов
  2. Применение SSL

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

Идея

Попросите сервер приложений заполнить IIS ISAPI Filter или httpmodule, который может читать, а затем обслуживать файл. Возможно, заполните заголовки ответа физическим путем к файлу, длиной содержимого и типом mime.

Вопросы

  1. Плохое дизайнерское решение, когда IIS не обслуживает файлы напрямую? Если да, то предложения о том, на что обратить внимание с точки зрения безопасности и обеспечения соблюдения SSL (CMS обрабатывает и то, и другое).
  2. Если вы собираетесь получить ответ от IIS, что делать, чтобы воспользоваться Кэширование статических файлов IIS? Или сколько пользы от кеша?

person orangepips    schedule 13.12.2010    source источник


Ответы (2)


Я считаю, что вы должны разрешить IIS обслуживать статические файлы. У вас может быть HttpModule (или ваш фильтр), передающий управление обратно в IIS - это означает, что может потребоваться репликация кода обеспечения безопасности. Еще один подход может заключаться в том, чтобы вернуть управление сервером приложений IIS для обслуживания файла (проверка безопасности, конечно же, должна была произойти раньше). Или, наконец, как указано вами, ваш сервер приложений может вводить заголовки ответов, а затем httpmodule их считывает и передает управление IIS. Не уверен насчет java, но в .NET вы можете использовать метод HttpResponse.TransmitFile для передачи управления IIS - при этом не нужно создавать файл HttpModule для обслуживания.

Наконец, для кэширования вы всегда можете генерировать заголовки кеша в ответ на пониженный уровень (кэширование на стороне прокси или на стороне клиента). Если файлы меняются, вы можете добавить зависимости файлов и т. Д.

РЕДАКТИРОВАТЬ: Не уверен, что это сработает для вас. Создайте обработчик http (ashx) и отметьте его как требуемый SSL в IIS. Все медиафайлы будут обслуживаться этим обработчиком. Обработчик примет файл, который будет служить параметром запроса. Теперь вы можете передать некоторый идентификатор файла или зашифрованный частичный путь (относительно настроенного базового пути к хранилищу файлов), чтобы фактическое имя файла или пути не были видны пользователю. Вы даже можете сделать токены, срок действия которых истечет через некоторое время (по сути, добавить идентификатор файла и метку времени и зашифровать его), чтобы пользователь не мог повторно запросить тот же файл с тем же параметром. Псевдокод для обработчика будет

void ProcessRequest(HttpContext context)
{
    // read file id/name token
    var token = context.Request["q"];

    // validate/decrypt token etc and get the actual path for file to be served
    string filePath;

    // set needed response headers - content-type, content-disposition and cache related
    ...

    // ask IIS to serve the file
    context.Response.TransmitFile(filePath);
}
person VinayC    schedule 13.12.2010
comment
+1 Есть предложения о том, как отправлять информацию о безопасности между сервером приложений и IIS, если последний выполняет обслуживание? И, если я согласился с предложенным мной подходом, похоже, что preSendRequestContent и preSendRequestHeaders - это, вероятно, два метода, с которыми я хочу работать с httpmodule? И я могу отправлять информацию через заголовки ответов, которые IIS может читать? - person orangepips; 13.12.2010
comment
В предлагаемом вами подходе ваш сервер приложений будет обработчиком Http, поэтому IMO, вы можете использовать PostRequestHandlerExecute в модуле http - это будет означать, что сервер приложений выполнил запрос и, возможно, добавил заголовки, которые сообщают вашему модулю, что это запрос должен обслуживаться IIS. Также см. Мою правку для альтернативного подхода. Надеюсь это поможет! - person VinayC; 13.12.2010

Это может сработать:

http://www.helicontech.com/ape/

В частности, часть x-sendfile.

person orangepips    schedule 13.12.2010