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.
Как заявил здесь, 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 секунд имеет хороший маленький учебник даю практический пример