Attualmente sto sviluppando un HttpHandler personalizzato (per la compressione/combinazione di CSS, ma non importa per questa domanda).Pattern per HttpHandler asincrono riutilizzabile
Ho iniziato con un semplice reusable = sincrono HttpHandler come tutti sappiamo.
Ora sto provando a migliorarlo con un gestore asincrono (poiché utilizza la funzionalità IO e viene utilizzato su un sito Web molto occupato).
Il mio primo tentativo (e questo sembra funzionare bene):
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
}
Questo è un HttpHandler non riutilizzabili (come da quanto ho letto, IsReusable dovrebbe essere falsa, perché questo gestore ha lo stato (l'asyncProcessRequest . campo)
Ora voglio fare questa riutilizzabile Così il mio primo pensiero è stato quello di creare un dizionario di IAsyncResult/Azione in questo modo:.
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);
}
}
questa è una correc modello? o sono via?
Sembra funzionare (Non ricevo eventuali errori o comportamenti strano), ma prima di mettere questo per la produzione, vorrei verificare con qualcuno che ha più esperienza di me nello scrivere queste gestori HTTP ..
Grazie in anticipo!
Sei sicuro di aver davvero bisogno di comprimere/compattare CSS per ogni singola richiesta? Forse, è meglio farlo durante le build/distribuzioni? –
... e/o assicurati che venga memorizzato correttamente nella cache. – Lucero
Il browser e il caching dei file sono gestiti correttamente. Ma questa domanda riguarda maggiormente il modello httphandler async/riutilizzabile ... –