Utilizzare HttpModule in modalità asincrona

di Daniele Bochicchio, in ASP.NET 2.0, HttpModule,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

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