2009-04-20 8 views
76

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.IHttpHandler vs IHttpModule

He utilizado HttpModules (interfaz IHttpModule) y HttpHandlers (interfaz IHttpHandler) y se me ocurre que podría implementar esto utilizando 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 mucho más fácil de configurar en ciertas situaciones? ¿No funciona uno bien con seguridad media?

+2

serio LOL'ed en 'Ocurre también a mí que yo 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é. –

+1

Sin preguntas, no habría respuestas ..:) – Sprintstar

Respuesta

65

Un ASP.NET HTTP manejador es el proceso (a menudo referido como el "punto final") que se ejecuta en respuesta a una solicitud hecha a un ASP Aplicación web .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 manejadores HTTP que rindan salida personalizada al navegador.

usos típicos para los controladores HTTP personalizados incluyen los siguientes:

  • RSS feeds Para crear un canal RSS para un sitio web, puede crear un controlador que emite 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 la respuesta del controlador.

Un módulo HTTP es un ensamblado que se llama en cada petición que se hace para su aplicación. Los módulos HTTP se llaman como parte de la canalización de solicitudes de 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.

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

  • seguridad porque se puede examinar las solicitudes de entrada, un módulo HTTP puede realizar la autenticación personalizada u otros controles de seguridad antes de que la página solicitada, de servicios Web XML, o manipulador es llamado. 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 se solicitan módulos HTTP 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.
  • Cabeceras o pies de página personalizados Debido a que puede modificar la respuesta de salida, puede insertar contenido como información de encabezado personalizado en cada página o respuesta de servicio web XML.

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

16

como se ha dicho here, HttpModules son clases simples que pueden conectarse a sí mismos en la canalización de procesamiento de solicitudes, mientras que HttpHandlers difieren de HttpModules no sólo por sus posiciones en la canalización de procesamiento de la solicitud, sino también porque se deben asignar a una específica extensiones de archivo.

+0

no es necesario asignar un controlador a una extensión si en un HttpModule se resuelve explícitamente a una clase que implementa iHttpHandler – rizzle

+0

@rizzle: ¿qué quiere decir con "resolver explícitamente a una clase que implementa IHttpHandler"? ¿Quieres decir que IHttpModule también es un IHttpHandler? –

+3

@Ryan: en el módulo puede adjuntar un método al evento HttpApplication.BeginRequest y otorgarle el controlador que elija, independientemente de la extensión de archivo – rizzle

13

IHttpModule le da mucho más control, básicamente puede controlar todos del tráfico dirigido a su aplicación web. IHttpHandler le da menos control (el tráfico se filtra antes de llega 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 simplemente usar esta clase desde IHttpModule o IHttpHandler. De esta forma, no tienes que preocuparte por elegir uno u otro. De hecho, puede crear una clase extra que implemente IHttpHandler y IHttpModule y luego decida qué usar configurándolo en Web.config.

+0

Gracias, puede explicar eso un poco por decir que estamos agregando autenticación personalizada a un servidor web para decir solicitudes remotas pero no usar eso para las locales – fayyazkl

5

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

Echa un vistazo a esta documentación de Microsoft (a media altura de la página en el "La solicitud es procesada por la tubería HttpApplication" sección):

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

se puede ver en el paso 15, donde el manejador tiene la oportunidad de ejecutar. Todos los eventos antes y después de ese paso están disponibles para la interceptación 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ías terminar usando ambos.

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

Aquí es una fuente libre y abierto uno:

http://www.brettle.com/neatupload

Aquí es un comercial:

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

Si nos fijamos en la documentación de NeatUpload, verá que se requiere que configure un módulo.

5

15 segundos y tiene una buena pequeña tutorial dando ejemplo práctico

+2

Este artículo ahora se puede encontrar en codeguru: http://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm – mhu

Cuestiones relacionadas