IHttpHandler проти IHttpModule


81

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

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

Отже, моє запитання таке: у яких випадках я вибрав би використовувати IHttpHandler замість IHttpModule (і навпаки / навпаки)?

Чи виконується набагато вище в трубопроводі? Чи набагато простіше налаштувати його в певних ситуаціях? Чи не працює добре середній рівень безпеки?


3
Серйозно LOL'ed на "Мені також здається, що я не розумію різниці між ними". Хороше запитання, але воно заслуговує на +1 лише для цього :)
JohnIdol

2
:-) Дякую. Я вважаю, що добре бути чесним щодо того, що я не знаю.
Dan Esparza

1
Без запитань відповідей не було б .. :)
Sprintstar

Відповіді:


70

Обробник 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


16

Як зазначено тут , HttpModules - це прості класи, які можуть підключитись до конвеєру обробки запитів, тоді як HttpHandlers відрізняються від HttpModules не лише своїми позиціями в конвеєрі обробки запитів, але й тим, що вони повинні бути зіставлені з певними розширеннями файлів.


вам не потрібно прив'язувати обробник до розширення, якщо в HttpModule ви явно вирішуєте клас, який реалізує iHttpHandler
missaghi

@rizzle: що ви маєте на увазі "явно вирішити до класу, який реалізує IHttpHandler"? Ви маєте на увазі, що IHttpModule - це також IHttpHandler?

3
@Ryan: У модулі ви можете приєднати метод до події HttpApplication.BeginRequest та надати йому обраний вами обробник, незалежно від розширення файлу
missaghi

15

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

У будь-якому випадку, мабуть, найкраще мати власну логіку в окремому класі, а потім просто використовувати цей клас з IHttpModuleабо IHttpHandler. Таким чином вам насправді не доведеться турбуватися про вибір того чи іншого. Насправді, ви могли б створити додатковий клас , який реалізує обидва IHttpHandler і IHttpModuleпотім вирішити , що використовувати, встановивши його в Web.config.


Дякую, чи можете ви пояснити, що трохи сказати, що ми додаємо власну автентифікацію до веб-сервера для віддалених запитів, але не використовуватимемо її для локальних?
fkl

5

Модулі призначені для обробки подій, викликаних додатком до та після того, як обробник фактично обробляє запит. З іншого боку, обробники не отримують можливості підписатись на будь-які події програми, а натомість просто отримують їх метод ProcessRequest, що викликається для "основної" роботи з обробки конкретного запиту.

Погляньте на цю документацію від Microsoft (приблизно на половині сторінки в розділі "Запит обробляється конвеєром HttpApplication"):

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

Ви можете побачити на кроці 15, де обробник отримує шанс виконати. Усі події до і після цього кроку доступні для перехоплення модулями, але не обробниками.

Залежно від того, яких конкретних функцій ви намагаєтесь досягти, ви можете використовувати обробник або модуль для реалізації обробника завантаження. Можливо, ви навіть зможете використовувати обидва.

Щось, на що слід звернути увагу, можна використати вже написаний обробник завантаження.

Ось безкоштовний і з відкритим кодом:

http://www.brettle.com/neatupload

Ось комерційний:

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

Якщо ви подивитесь на документацію до NeatUpload, то побачите, що для цього потрібно налаштувати модуль.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.