IHttpHandler против IHttpModule

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

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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

Здесь свободный и открытый исходный код:

http://www.brettle.com/neatupload

Здесь коммерческий:

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

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

Ответ 5

15 секунд имеет приятный небольшой учебник, дающий практический пример