Così come esiste la possibilità di utilizzare tecniche asincrone all'interno di pagine ASP.NET, è possibile sfruttare questi meccanismi anche in presenza di HttpModule, per eseguire operazioni particolarmente lunghe senza bloccare il worker thread che si occupa di gestire richiesta e risposta.
Supponendo di avere un webservice particolarmente lento, dopo aver creato il proxy necessario al suo sfruttamento, è sufficiente registrare nel metodo Init del module per l'evento BeginRequest, ma utilizzando AddOnBeginRequestAsync, così da poter specificare un event handler da associare all'inizio dell'operazione ed uno da invocare come callback alla fine dell'operazione.
In questo esempio di richiama semplicemente un metodo HelloWorld del web service sfruttando la sua modalità asincrona, ricevendo il risultato quando questo sarà processato. Per rendersi conto dell'effetto funzionamento di questa modalità, è sufficiente inserire, esclusivamente come prova, una riga con Thread.Sleep(4000) all'interno del metodo chiamato, che ha l'effetto di fermare per 4 secondi l'esecuzione del codice all'interno del web service.
using System; using System.Web; using System.Web.Security; using System.Threading; public class AsyncModule : IHttpModule { private static Services.TestService() service; public void Dispose() { // nothing } public void Init(HttpApplication context) { context.AddOnBeginRequestAsync(new BeginEventHandler(BeginRequestAsync), new EndEventHandler(EndRequestAsync)); } // la richiesta comincia IAsyncResult BeginRequestAsync(object sender, EventArgs e, AsyncCallback callback, object extraData) { service = new Services.TestService(); return service.BeginHelloWorld(callback, extraData); } // intercetto la fine dell'operazione void EndRequestAsync(IAsyncResult result) { WebClientAsyncResult requestState = result as WebClientAsyncResult; if (requestState != null) { HttpContext.Current.Response.Write(service.EndHelloWorld(result)); } } }
Per approfondimenti sulle tecniche di sviluppo multi-threading, si veda:
http://tags.aspitalia.com/MultiThreading/
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
I più letti di oggi
- Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Eseguire script pre e post esecuzione di un workflow di GitHub
- Creare una libreria CSS universale: Cards
- Migliorare l'organizzazione delle risorse con Azure Policy