IHttpHandler frente a IHttpModule

81

Mi pregunta es simple (aunque la respuesta probablemente no lo sea): estoy tratando de decidir cómo implementar un controlador de carga del lado del servidor en C # / ASP.NET.

He usado tanto HttpModules (interfaz IHttpModule) como HttpHandlers (interfaz IHttpHandler) y se me ocurre que podría implementar esto usando cualquier mecanismo. También se me ocurre que no entiendo las diferencias entre los dos.

Entonces, mi pregunta es la siguiente: ¿En qué casos elegiría usar IHttpHandler en lugar de IHttpModule (y viceversa)?

¿Se ejecuta uno mucho más alto en la tubería? ¿Es mucho más fácil de configurar en determinadas situaciones? ¿No funciona bien con seguridad media?

Dan Esparza
fuente
3
En serio LOL'ed at 'También se me ocurre que no entiendo las diferencias entre los dos'. Buena pregunta, pero merecería un +1 solo por eso :)
JohnIdol
2
:-) Gracias. Encuentro que es bueno ser honesto sobre las cosas que no sé.
Dan Esparza
1
Sin preguntas, no habría respuestas .. :)
Sprintstar

Respuestas:

70

Un controlador HTTP de ASP.NET es el proceso (con frecuencia denominado "punto final") que se ejecuta en respuesta a una solicitud realizada a una aplicación web ASP.NET. El controlador más común es un controlador de página ASP.NET que procesa archivos .aspx. Cuando los usuarios solicitan un archivo .aspx, la página procesa la solicitud a través del controlador de página. Puede crear sus propios controladores HTTP que generen resultados personalizados en el navegador.

Los usos típicos de los controladores HTTP personalizados incluyen los siguientes:

  • Fuentes RSS Para crear una fuente RSS para un sitio web, puede crear un controlador que emita XML con formato RSS. A continuación, puede vincular una extensión de nombre de archivo como .rss al controlador personalizado. Cuando los usuarios envían una solicitud a su sitio que termina en .rss, ASP.NET llama a su controlador para procesar la solicitud.
  • Servidor de imágenes Si desea que una aplicación web sirva imágenes en una variedad de tamaños, puede escribir un controlador personalizado para cambiar el tamaño de las imágenes y luego enviarlas al usuario como respuesta del controlador.

Un módulo HTTP es un ensamblado que se llama en cada solicitud que se realiza a su aplicación. Los módulos HTTP se llaman como parte de la canalización de solicitudes ASP.NET y tienen acceso a los eventos del ciclo de vida a lo largo de la solicitud. Los módulos HTTP le permiten examinar las solicitudes entrantes y salientes y tomar medidas en función de la solicitud.

Los usos típicos de los módulos HTTP incluyen los siguientes:

  • Seguridad Dado que puede examinar las solicitudes entrantes, un módulo HTTP puede realizar una autenticación personalizada u otras comprobaciones de seguridad antes de que se llame a la página solicitada, al servicio Web XML o al controlador. En Internet Information Services (IIS) 7.0 que se ejecuta en modo integrado, puede extender la autenticación de formularios a todos los tipos de contenido en una aplicación.
  • Estadísticas y registro Dado que los módulos HTTP se invocan en cada solicitud, puede recopilar estadísticas de solicitud e información de registro en un módulo centralizado, en lugar de en páginas individuales.
  • Encabezados o pies de página personalizados Debido a que puede modificar la respuesta saliente, puede insertar contenido como información de encabezado personalizado en cada página o respuesta del servicio Web XML.

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

Ramani Sandeep
fuente
16

Como se indica aquí , HttpModules son clases simples que pueden conectarse a sí mismas en la canalización de procesamiento de solicitudes, mientras que HttpHandlers difieren de HttpModules no solo por sus posiciones en la canalización de procesamiento de solicitudes, sino también porque deben asignarse a extensiones de archivo específicas.

Kirtan
fuente
no necesita asignar un controlador a una extensión si en un HttpModule se resuelve explícitamente en una clase que implementa iHttpHandler
missaghi
@rizzle: ¿a qué te refieres con "resolver explícitamente a una clase que implementa IHttpHandler"? ¿Quiere decir que IHttpModule también es un IHttpHandler?
3
@Ryan: en el módulo puede adjuntar un método al evento HttpApplication.BeginRequest y darle el controlador que elija, independientemente de la extensión del archivo
missaghi
15

IHttpModulele da mucho más control, básicamente puede controlar todo el tráfico dirigido a su aplicación web. IHttpHandlerle da menos control (el tráfico se filtra antes de que llegue a su controlador), pero si esto es suficiente para sus necesidades, entonces no veo ninguna razón para usar el IHttpModule.

De todos modos, probablemente sea mejor tener su lógica personalizada en una clase separada y luego usar esta clase de IHttpModuleo IHttpHandler. De esta manera, realmente no tiene que preocuparse por elegir uno u otro. De hecho, se podría crear una clase extra que implementa ambos IHttpHandler y IHttpModuley luego decidir qué usar estableciéndola en Web.config.

Igor Brejc
fuente
Gracias, ¿puede explicar un poco por decir que estamos agregando autenticación personalizada a un servidor web para, por ejemplo, solicitudes remotas, pero no lo usamos para las locales?
fkl
5

Los módulos están pensados ​​para manejar eventos generados por la aplicación antes y después de que el controlador realmente procese la solicitud. Los controladores, por otro lado, no tienen la oportunidad de suscribirse a ningún evento de la aplicación y, en su lugar, simplemente obtienen su método ProcessRequest invocado para el trabajo "principal" de procesar una solicitud específica.

Eche un vistazo a esta documentación de Microsoft (aproximadamente a la mitad de la página en la sección "La solicitud es procesada por la canalización de HttpApplication"):

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

Puede ver en el paso 15 dónde el controlador tiene la oportunidad de ejecutar. Todos los eventos antes y después de ese paso están disponibles para ser interceptados por módulos, pero no por controladores.

Dependiendo de las características específicas que intente lograr, puede usar un controlador o un módulo para implementar un controlador de carga. Incluso podría terminar usando ambos.

Algo a considerar podría ser usar un controlador de carga que ya está escrito.

Aquí hay uno gratuito y de código abierto:

http://www.brettle.com/neatupload

Aquí hay uno comercial:

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

Si observa la documentación de NeatUpload, verá que requiere que configure un módulo.

Jason diamante
fuente