IHttpHandler vs IHttpModule


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 cualquiera de los mecanismos. También se me ocurre que no entiendo las diferencias entre los dos.

Así que mi pregunta es esta: 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 uno mucho más fácil de configurar en ciertas situaciones? ¿No funciona bien con seguridad media?

Author: Dan Esparza, 2009-04-20

5 answers

An ASP.NET HTTP handler es el proceso (frecuentemente denominado "endpoint") que se ejecuta en respuesta a una solicitud realizada a un ASP.NET Aplicación web. El controlador más común es un ASP.NET manejador de página que procesa .archivos aspx. Cuando los usuarios solicitan un .archivo aspx, la solicitud es procesada por la página a través del controlador de página. Puede crear sus propios controladores HTTP que rendericen resultados personalizados en el navegador.

Los usos típicos de los manejadores HTTP personalizados incluyen siguiente:

  • 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 manejador personalizado. Cuando los usuarios envían una solicitud a su sitio que termina en .rss, ASP.NET llama a tu manejador 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 el 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 del ASP.NET solicite canalización y tenga acceso a eventos del ciclo de vida durante toda 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 Porque se puede examinar entrante solicitudes, un módulo HTTP puede realizar autenticación personalizada u otras comprobaciones de seguridad antes de llamar 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 de una aplicación.
  • Estadísticas y registro Debido a que los módulos HTTP se llaman en cada solicitud, puede recopilar estadísticas de solicitud e información de registro en un módulo centralizado, en lugar de en forma individual pagina.
  • 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 de servicio web XML.

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

 66
Author: Ramani Sandeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-30 13:59:33

Como se indica aquí, HttpModules son clases simples que se pueden conectar 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 ser mapeados a una extensión de archivo específica.

 16
Author: Kirtan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-20 18:11:33

IHttpModule le da mucho más control, básicamente puede controlar todo del tráfico dirigido a su aplicación Web. IHttpHandler le 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 solo use esta clase desde IHttpModule o IHttpHandler. Así no tendrás que preocuparte. sobre elegir uno u otro. De hecho, podría crear una clase adicional que implementa ambos IHttpHandler y IHttpModule y luego decide qué usar configurándolo en Web.config.

 15
Author: Igor Brejc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-20 18:14:11

Los módulos están diseñados para manejar eventos generados por la aplicación antes y después de que la solicitud sea procesada por el controlador. Los controladores, por otro lado, no tienen la oportunidad de suscribirse a ningún evento de 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 el "La solicitud es procesada por el HttpApplication pipeline " sección):

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

Se puede ver en el paso 15 donde 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 esté tratando de lograr, podría usar un controlador o un módulo para implementar un controlador de carga. Incluso podría terminar usando ambos.

Algo a considerar podría 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 una comercial:

Http://krystalware.com/Products/SlickUpload /

Si miras la documentación de NeatUpload, verás que requiere que configures un módulo.

 5
Author: Jason Diamond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-20 18:21:05

15 segundos tiene un pequeño tutorial dando un ejemplo práctico

 5
Author: Yordan Georgiev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-16 12:15:43