2010-12-13 2 views
2

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

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

  1. Закрепления адрес
  2. Обеспечение SSL

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

Идея

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

Вопросы

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

ответ

2

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

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

EDIT: Не уверен, что это сработает для вас. Создайте обработчик 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); 
} 
+0

+1 Любое предложение о том, как отправлять информацию о безопасности между сервером приложений и IIS, если у меня есть последние, обслуживает? И, если бы я пошел с моим предложенным подходом, это выглядит как preSendRequestContent и preSendRequestHeaders, вероятно, это два метода, с которыми я хочу работать на httpmodule? И я могу отправить информацию через заголовки ответов, которые IIS может читать? – orangepips

+1

В вашем предлагаемом подходе ваш сервер приложений будет Http-обработчиком, поэтому IMO, вы можете использовать «PostRequestHandlerExecute» в модуле http - это будет означать, что приложение Server выполнило с запросом и могло добавить заголовки, которые будут сообщать вашему модулю, что этот запрос должен обслуживаться IIS. Также см. Мое редактирование для альтернативного подхода. Надеюсь это поможет! – VinayC