IHttpHandler против IHttpModule

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

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

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

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


person Dan Esparza    schedule 20.04.2009    source источник
comment
Серьезно смеялся над «Мне также приходит в голову, что я не понимаю различий между ними». Хороший вопрос, но только за это он заслужил бы +1 :)   -  person JohnIdol    schedule 10.03.2011
comment
:-) Спасибо. Я считаю, что хорошо быть честным в том, чего я не знаю.   -  person Dan Esparza    schedule 10.03.2011
comment
Без вопросов не было бы ответов .. :)   -  person Sprintstar    schedule 13.07.2011


Ответы (5)


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

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

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

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

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

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

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

person Ramani Sandeep    schedule 21.09.2009

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

person Kirtan    schedule 20.04.2009
comment
вам не нужно сопоставлять обработчик с расширением, если в HttpModule вы явно разрешаете класс, который реализует iHttpHandler - person missaghi; 21.04.2009
comment
@rizzle: что вы имеете в виду, явно разрешить класс, реализующий IHttpHandler? Вы имеете в виду, что IHttpModule также является IHttpHandler? - person ; 10.08.2010
comment
@Ryan: в модуле вы можете прикрепить метод к событию HttpApplication.BeginRequest и назначить ему обработчик, который вы выберете, независимо от расширения файла. - person missaghi; 18.08.2010

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

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

person Igor Brejc    schedule 20.04.2009
comment
Спасибо, можете ли вы объяснить это немного за то, что мы добавляем настраиваемую аутентификацию на веб-сервер, скажем, для удаленных запросов, но не используем это для локальных? - person fkl; 30.06.2016

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

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

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

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

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

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

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

http://www.brettle.com/neatupload

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

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

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

person Jason Diamond    schedule 20.04.2009

15 секунд имеет красивый маленький руководство с практическим примером

person Yordan Georgiev    schedule 20.05.2009
comment
Эту статью теперь можно найти на codeguru: codeguru.com/csharp/.net/net_asp/article.php/c19389/. - person mhu; 18.07.2012