Actualmente estoy desarrollando un HttpHandler personalizado (para comprimir/combinar CSS, pero eso no importa para esta pregunta).Patrón para HttpHandler asincrónico reutilizable
Empecé con un HttpHandler sencillo reutilizable = verdadero sincrónico, como todos sabemos.
Ahora estoy tratando de mejorarlo a un controlador asincrónico (ya que utiliza la funcionalidad IO y se usa en un sitio web muy ocupado).
Mi primer intento (y esto parece funcionar bien):
Action<HttpContext> asyncProcessRequest;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
asyncProcessRequest = new Action<HttpContext>(ProcessRequest);
return asyncProcessRequest.BeginInvoke(context, cb, extraData);
}
public void EndProcessRequest(IAsyncResult result)
{
asyncProcessRequest.EndInvoke(result);
}
public virtual void ProcessRequest(HttpContext context)
{
// real work
}
Ésta es una HttpHandler no reutilizables (como por lo que leí, IsReusable debe ser falsa, porque este controlador tiene el estado (el asyncProcessRequest . campo)
Ahora quiero hacer esta reutilizable Así que mi primera idea era crear un diccionario de IAsyncResult/acción como esta:.
IDictionary<IAsyncResult, Action<HttpContext>> asyncProcessRequests;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
if (asyncProcessRequests == null)
{
asyncProcessRequests = new Dictionary<IAsyncResult, Action<HttpContext>>();
}
var request = new Action<HttpContext>(ProcessRequest);
var result = request.BeginInvoke(context, cb, extraData);
asyncProcessRequests.Add(result, request);
return result;
}
public void EndProcessRequest(IAsyncResult result)
{
Action<HttpContext> action;
if (asyncProcessRequests.TryGetValue(result, out action))
{
action.EndInvoke(result);
}
}
¿Es esta una correc t patrón? o estoy lejos?
Parece que funciona (no estoy recibiendo ningún error o comportamiento extraño), pero antes de poner esto a la producción, me gustaría comprobar con alguien que tiene más experiencia que yo al escribir estos controladores HTTP ..
¡Gracias de antemano!
¿Estás seguro de que realmente necesitas comprimir/compactar CSS para todas y cada una de las solicitudes? Tal vez, es mejor hacer esto durante las compilaciones/implementaciones? –
... y/o asegúrese de que se almacena en caché correctamente. – Lucero
el almacenamiento en caché de archivos y archivos se maneja correctamente. Pero esta pregunta es más sobre el patrón httphandler asincrónico/reutilizable ... –