¿Cuál es el uso de IHttpHandler.IsReusable?

104

Estoy escribiendo un IHttpHandlery tendré que implementar una IsReusablepropiedad. Cuando miro la documentación de MSDN , dice:

Obtiene un valor que indica si otra solicitud puede usar la instancia de IHttpHandler.

Esto no es muy útil. ¿En qué situaciones debería utilizar un controlador reutilizable y en qué situaciones no debería ser reutilizable?

Preguntas de seguimiento:

  1. ¿Qué es la reutilización?
  2. ¿Puedo mantener el estado (es decir, las variables de clase) cuando Reusable = true?
Kees C. Bakker
fuente
9
Eche un vistazo aquí: foreachbiscuit.wordpress.com/2007/11/01/…
Homam
"Reutilizar" significa manejar más de una solicitud con una instancia particular del controlador. Puede almacenar cualquier cosa en Session; no se verá afectado cuando se libere la instancia del controlador.
Irish Chieftain
@IrishChieftain ¿Es como si .Net tuviera una bolsa de HttpHandlers instanciados, eligiera uno y simplemente lo alimentara con un contexto?
Kees C. Bakker
1
@IrishChieftain en este momento lo estoy usando para un transmisor simple de información de registro. Pero estoy tratando de aprender cuáles son las implicaciones para comprender cuándo y cómo usar IHttpHandlers. Son una característica olvidada por muchos.
Kees C. Bakker

Respuestas:

93

Esta propiedad indica si se pueden procesar varias solicitudes con la misma instancia de IHttpHandler. De forma predeterminada, al final de una canalización de solicitudes, todos los controladores http que se colocan en handlerRecycleList de HttpApplication se establecen en nulos. Si un controlador es reutilizable, no se establecerá en nulo y la instancia se reutilizará en la siguiente solicitud.

La principal ventaja es el rendimiento porque habrá menos objetos para recolectar basura.
El problema más importante para el manipulador reutilizable es que debe ser seguro para subprocesos. Esto no es trivial y requiere cierto esfuerzo.

Personalmente, sugiero que deje el valor predeterminado (no reutilizable) si usa solo recursos administrados porque el recolector de basura debería manejarlos fácilmente. La ganancia de rendimiento de los controladores reutilizables suele ser insignificante en comparación con el riesgo de introducir errores de subprocesamiento difíciles de encontrar.

Si decide reutilizar el controlador, debe evitar mantener el estado en las variables de clase porque si se accede a la instancia del controlador simultáneamente, varias solicitudes escribirán / leerán los valores.

Branislav Abadjimarinov
fuente
1
Su última recomendación para evitar mantener el estado en las variables de clase es un poco confusa. Suponiendo que establezca IsReusable en falso, ¿no habría posibilidad de que otra solicitud (concurrente o no) acceda a la misma instancia de ese HttpHandler y, por lo tanto, mantener el estado en las variables de clase sería seguro?
Ben Amada
2
Por supuesto. He reformulado la última recomendación haciendo hincapié en que es aplicable solo si se reutiliza IHttpHandler. ¡Gracias por la aclaración, Ben!
Branislav Abadjimarinov
7
Por lo que vale, he implementado muchos, muchos IHttpHandlers con IsReusableconfigurados truey no he tenido problemas. Lo principal a tener en cuenta es no tener ninguna variable dentro del ámbito de la clase, sino utilizar variables locales en sus funciones.
dana
6
Gran explicación Claro y al grano. Ojalá los artículos de MSDN fueran así de concisos.
AlexVPerl
1
@Branislav - Si entiendo bien tu respuesta. No solo es posible que diferentes subprocesos utilicen diferentes instancias del controlador al mismo tiempo, sino que también es posible que diferentes subprocesos ejecuten la MISMA instancia del controlador al mismo tiempo.
Ian
11

Aparentemente, esto mantiene al controlador en la memoria y capaz de manejar múltiples solicitudes. Cuando se establece en falso, tiene que crear una nueva instancia del controlador para cada solicitud entrante.

Aquí hay una pregunta que muestra lo que sucede cuando no se usa correctamente:

Transmisión de imágenes basadas en datos mediante HttpHandler

IrishCieftain
fuente
¿Tiene alguna documentación que respalde su respuesta?
Kees C. Bakker
4
Al igual que usted, no pude encontrar documentación satisfactoria en MSDN, así que tuve que probar la carga de imágenes desde una base de datos a una página de un sitio de comercio electrónico y luego observar lo que sucedió :)
IrishChieftain
5

Es más barato reciclar el controlador que uno nuevo cada vez que entra una solicitud y el servidor acumula menos memoria, lo que facilita el trabajo que GC tiene que realizar. Si el manejador se encuentra en un estado en el que tratar con una nueva solicitud no sería problemático (es decir, se ha restablecido cualquier estado en la instancia del manejador) , entonces debería calificar como reutilizable.

EDITAR

No estoy seguro de si mi respuesta define correctamente qué es la reutilización. En realidad, permite la reutilización simultánea, por lo que es mejor evitar el estado o administrarlo con cuidado de manera segura para subprocesos.

gastador
fuente
Yo también lo pensaría. Tienes razón, la pregunta real (fundamental) es: '¿Qué es la reutilización?'
Kees C. Bakker