IHttpHandler против IHttpModule

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

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

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

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

5 ответов


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

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

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

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

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

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

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


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


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

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


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

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

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

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

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

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

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

http://www.brettle.com/neatupload

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

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

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


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