IHttpHandler vs IHttpModule

81

Moje pytanie jest proste (chociaż odpowiedź najprawdopodobniej nie będzie): próbuję zdecydować, jak zaimplementować program obsługi przesyłania po stronie serwera w C # / ASP.NET.

Użyłem zarówno HttpModules (interfejs IHttpModule), jak i HttpHandlers (interfejs IHttpHandler) i wydaje mi się, że mógłbym to zaimplementować za pomocą dowolnego mechanizmu. Wydaje mi się również, że nie rozumiem różnic między nimi.

Moje pytanie brzmi więc: w jakich przypadkach wybrałbym używanie IHttpHandler zamiast IHttpModule (i odwrotnie)?

Czy jest wykonywany znacznie wyżej w rurociągu? Czy jest dużo łatwiejszy do skonfigurowania w określonych sytuacjach? Czy nie działa dobrze ze średnim zabezpieczeniem?

Dan Esparza
źródło
3
Poważnie LOL: „Wydaje mi się również, że nie rozumiem różnic między nimi”. Dobre pytanie, ale zasługiwałoby na +1 tylko za to :)
JohnIdol
2
:-) Dzięki. Uważam, że dobrze jest być szczerym w sprawach, których nie znam.
Dan Esparza,
1
Bez pytań nie byłoby odpowiedzi .. :)
Sprintstar 13.07.11

Odpowiedzi:

70

Procedura obsługi HTTP ASP.NET to proces (często nazywany „punktem końcowym”), który jest uruchamiany w odpowiedzi na żądanie skierowane do aplikacji sieci Web ASP.NET. Najpopularniejszym programem obsługi jest program obsługi stron ASP.NET, który przetwarza pliki aspx. Gdy użytkownicy żądają pliku aspx, żądanie jest przetwarzane przez stronę za pośrednictwem programu obsługi strony. Możesz utworzyć własne programy obsługi HTTP, które wyświetlają niestandardowe dane wyjściowe w przeglądarce.

Typowe zastosowania niestandardowych programów obsługi HTTP obejmują:

  • Źródła danych RSS Aby utworzyć kanał RSS dla witryny sieci Web, można utworzyć procedurę obsługi, która emituje format XML w formacie RSS. Następnie można powiązać rozszerzenie nazwy pliku, takie jak .rss, z niestandardową obsługą. Gdy użytkownicy wysyłają żądanie do witryny, które kończy się na .rss, ASP.NET wywołuje program obsługi w celu przetworzenia żądania.
  • Serwer obrazów Jeśli chcesz, aby aplikacja sieci Web obsługiwała obrazy w różnych rozmiarach, możesz napisać niestandardową procedurę obsługi, aby zmienić rozmiar obrazów, a następnie wysłać je do użytkownika jako odpowiedź programu obsługi.

HTTP moduł jest zespół, który nazywa się na każde żądanie, który jest wykonany do aplikacji. Moduły HTTP są wywoływane jako część potoku żądań ASP.NET i mają dostęp do zdarzeń cyklu życia w całym żądaniu. Moduły HTTP umożliwiają badanie żądań przychodzących i wychodzących oraz podejmowanie działań na podstawie żądania.

Typowe zastosowania modułów HTTP obejmują:

  • Bezpieczeństwo Ponieważ można badać przychodzące żądania, moduł HTTP może przeprowadzać niestandardowe uwierzytelnianie lub inne kontrole bezpieczeństwa przed wywołaniem żądanej strony, usługi sieci Web XML lub programu obsługi. W Internetowych usługach informacyjnych (IIS) 7.0 działających w trybie zintegrowanym można rozszerzyć uwierzytelnianie formularzy na wszystkie typy zawartości w aplikacji.
  • Statystyki i rejestrowanie Ponieważ moduły HTTP są wywoływane przy każdym żądaniu, można gromadzić statystyki żądań i rejestrować informacje w scentralizowanym module zamiast na poszczególnych stronach.
  • Niestandardowe nagłówki lub stopki Ponieważ możesz modyfikować odpowiedź wychodzącą, możesz wstawiać zawartość, taką jak niestandardowe informacje nagłówka, do każdej strony lub odpowiedzi usługi sieci Web XML.

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

Ramani Sandeep
źródło
16

Jak wspomniano tutaj , HttpModules to proste klasy, które mogą się podłączyć do potoku przetwarzania żądań, podczas gdy HttpHandlers różnią się od HttpModules nie tylko ze względu na ich pozycje w potoku przetwarzania żądań, ale także dlatego, że muszą być mapowane na określone rozszerzenia plików.

Kirtan
źródło
nie musisz mapować programu obsługi na rozszerzenie, jeśli w HttpModule jawnie rozwiązujesz do klasy, która implementuje iHttpHandler
missaghi
@rizzle: co masz na myśli „jawnie wybierz klasę, która implementuje IHttpHandler”? Czy masz na myśli, że IHttpModule jest również IHttpHandler?
3
@Ryan: W module można dołączyć metodę do zdarzenia HttpApplication.BeginRequest i nadać jej obsługi, które wybierzesz, niezależnie od rozszerzenia pliku
missaghi
15

IHttpModuledaje znacznie większą kontrolę, możesz w zasadzie kontrolować cały ruch kierowany do Twojej aplikacji internetowej. IHttpHandlerdaje ci mniejszą kontrolę (ruch jest filtrowany, zanim dotrze do twojego programu obsługi), ale jeśli jest to wystarczające dla twoich potrzeb, nie widzę powodu, aby używaćIHttpModule .

W każdym razie prawdopodobnie najlepiej jest mieć własną logikę w osobnej klasie, a następnie po prostu użyć tej klasy z jednego IHttpModulelub IHttpHandler. W ten sposób nie musisz się martwić o wybór jednego lub drugiego. W rzeczywistości, można utworzyć dodatkowe klasy, która implementuje zarówno IHttpHandler a IHttpModule, a następnie zdecydować, co do wykorzystania przez ustawienie go w Web.config.

Igor Brejc
źródło
Dzięki, czy możesz wyjaśnić, że trochę na przykład dodajemy niestandardowe uwierzytelnianie do serwera internetowego, na przykład dla żądań zdalnych, ale nie używamy tego do lokalnych?
fkl
5

Moduły są przeznaczone do obsługi zdarzeń wywoływanych przez aplikację przed i po przetworzeniu żądania przez program obsługi. Z drugiej strony programy obsługujące nie mają możliwości subskrybowania żadnych zdarzeń aplikacji, a zamiast tego po prostu wywołują metodę ProcessRequest w celu wykonania „głównej” pracy polegającej na przetwarzaniu określonego żądania.

Zapoznaj się z dokumentacją firmy Microsoft (mniej więcej w połowie strony w sekcji „Żądanie jest przetwarzane przez potok HttpApplication”):

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

W kroku 15 możesz zobaczyć, gdzie program obsługi ma szansę wykonać. Wszystkie zdarzenia przed i po tym kroku są dostępne do przechwycenia przez moduły, ale nie do obsługi.

W zależności od konkretnych funkcji, które próbujesz osiągnąć, możesz użyć modułu obsługi lub modułu do zaimplementowania modułu obsługi przesyłania. Możesz nawet skończyć używając obu.

Warto rozważyć użycie już napisanej procedury obsługi przesyłania.

Oto darmowy i open source:

http://www.brettle.com/neatupload

Oto komercyjny:

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

Jeśli spojrzysz na dokumentację NeatUpload, zobaczysz, że wymaga ona skonfigurowania modułu.

Jason Diamond
źródło