IHttpHandler против IHttpModule - PullRequest
       56

IHttpHandler против IHttpModule

79 голосов
/ 20 апреля 2009

Мой вопрос прост (хотя ответ, скорее всего, не будет): я пытаюсь решить, как реализовать обработчик загрузки на стороне сервера в C # / ASP.NET.

Я использовал как HttpModules (интерфейс IHttpModule), так и HttpHandlers (интерфейс IHttpHandler), и мне пришло в голову, что я могу реализовать это, используя любой механизм. Мне также кажется, что я не понимаю различий между ними.

Поэтому мой вопрос таков: В каких случаях я бы выбрал использование IHttpHandler вместо IHttpModule (и наоборот)?

Выполняется ли намного выше в конвейере? Намного легче настроить в определенных ситуациях? Не хорошо ли работает со средней безопасностью?

Ответы [ 5 ]

69 голосов
/ 21 сентября 2009

ASP.NET HTTP-обработчик - это процесс (часто называемый «конечной точкой»), который выполняется в ответ на запрос веб-приложения ASP.NET. Самым распространенным обработчиком является обработчик страниц ASP.NET, который обрабатывает файлы ASPX. Когда пользователи запрашивают файл .aspx, запрос обрабатывается страницей через обработчик страницы. Вы можете создавать свои собственные обработчики HTTP, которые отображают пользовательский вывод в браузере.

Типичные области применения пользовательских обработчиков HTTP включают следующее:

  • RSS-каналы Чтобы создать RSS-канал для веб-сайта, вы можете создать обработчик, который генерирует XML-формат в формате RSS. Затем вы можете привязать расширение имени файла, например .rss, к пользовательскому обработчику. Когда пользователи отправляют запрос на ваш сайт, который заканчивается на .rss, ASP.NET вызывает ваш обработчик для обработки запроса.
  • Сервер изображений Если вы хотите, чтобы веб-приложение обслуживало изображения различных размеров, вы можете написать собственный обработчик для изменения размера изображений и затем отправить их пользователю в качестве ответа обработчика.

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

Типичные применения для модулей HTTP включают следующее:

  • Безопасность Поскольку вы можете просматривать входящие запросы, модуль HTTP может выполнять пользовательскую аутентификацию или другие проверки безопасности перед вызовом запрашиваемой страницы, веб-службы XML или обработчика. В Internet Information Services (IIS) 7.0, работающем в интегрированном режиме, вы можете расширить проверку подлинности форм для всех типов содержимого в приложении.
  • Статистика и ведение журнала Поскольку HTTP-модули вызываются при каждом запросе, вы можете собирать статистику запросов и регистрировать информацию в централизованном модуле, а не на отдельных страницах.
  • Настраиваемые верхние или нижние колонтитулы Поскольку вы можете изменить исходящий ответ, вы можете вставить содержимое, например информацию о настраиваемом заголовке, на каждую страницу или в ответ веб-службы XML.

От: http://msdn.microsoft.com/en-us/library/bb398986.aspx

16 голосов
/ 20 апреля 2009

Как указано здесь , HttpModules - это простые классы, которые могут подключаться к конвейеру обработки запросов, тогда как HttpHandlers отличаются от HttpModules не только из-за своих позиций в конвейере обработки запросов, но и потому, что они должны быть сопоставлены с определенными расширениями файлов.

15 голосов
/ 20 апреля 2009

IHttpModule дает вам гораздо больший контроль, вы в основном можете контролировать весь трафика, направляемого в ваше веб-приложение. IHttpHandler дает вам меньше контроля (трафик фильтруется до того, как достигнет вашего обработчика), но если этого достаточно для ваших нужд, то я не вижу причин использовать IHttpModule.

В любом случае, вероятно, лучше иметь свою собственную логику в отдельном классе, а затем просто использовать этот класс из IHttpModule или IHttpHandler. Таким образом, вам не нужно беспокоиться о выборе одного или другого. Фактически, вы можете создать дополнительный класс, который реализует и IHttpHandler и IHttpModule, а затем решить, что использовать, установив его в Web.config.

5 голосов
/ 20 мая 2009

15 секунд имеет хороший маленький учебник с практическим примером

5 голосов
/ 20 апреля 2009

Модули предназначены для обработки событий, вызванных приложением, до и после того, как запрос фактически обработан обработчиком. С другой стороны, обработчикам не предоставляется возможность подписаться на какие-либо события приложения, и вместо этого просто вызывается их метод ProcessRequest для выполнения «основной» работы по обработке конкретного запроса.

Посмотрите на эту документацию от Microsoft (примерно на полпути вниз по странице в разделе «Запрос обрабатывается конвейером HttpApplication»):

http://msdn.microsoft.com/en-us/library/bb470252.aspx

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

В зависимости от того, какие конкретные функции вы пытаетесь достичь, вы можете использовать либо обработчик, либо модуль для реализации обработчика загрузки. Вы можете даже использовать оба.

Что-то, что следует учитывать, может использовать обработчик загрузки, который уже написан.

Вот бесплатный и открытый исходный код:

http://www.brettle.com/neatupload

Вот коммерческий:

http://krystalware.com/Products/SlickUpload/

Если вы посмотрите документацию для NeatUpload, то увидите, что для этого требуется настроить модуль.

...