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
- Utilizzare una qualunque lista per i parametri di tipo params in C#
- Includere un button in un component ed esporne l'evento click in Angular
- #SQLServer #Modeling (codename Oslo) CTP di nov 2009 aggiornato per VS 2010 RC: http://u.aspitalia.com/fi
- .NET Conference Italia 2019 Live - Milano
- Accedere a file XML remoti con ASP.NET
- Creare una libreria CSS universale: Nav menu
- Utilizzare funzioni di istanza con le Azure Function
- A quick tour around Azure Dev Spaces