HttpModule di ASP.NET per esempi

3 pagine in totale: <<Indietro 1 2 [3]

L'HttpModule si inserisce all'inizio della richiesta e chiama il metodo Validate della classe QueryStringValidatorUtility che fa il vero lavoro. Innanzitutto viene recuperata l'istanza dell'handler corrente e ne vengono recuperati tuti gli attributi di validazione specificati. (Nella pagina precedente questa ricerca avrebbe portato un solo attributo). Per ogni attributo, viene invocato il metodo EvaluateIsValid, derivato dalla classe base, ed in caso di risultato negativo viene segnalato l'errore in Context.Items e sollevata un'eccezione a seconda della configurazione.

Per quanti tipi di validazione si possano creare, esistono sempre dei casi in cui si deve ricorrere a del codice personalizzato e quindi si deve effettuare una validazione custom. In questi casi il codice va piazzato nella pagina in esame ed il validatore si deve preoccupare solo di chiamare quel metodo. A questo punto basta creare un'interfaccia che venga implementata dalla pagina e che sia utilizzata dal validatore per poter chiamare il metodo di validazione custom.

public interface ICustomQueryStringValidator
{
  bool QueryStringValidate();
}

public sealed class CustomQueryStringValidatorAttribute :
  BaseQueryStringValidatorAttribute
{
  public override bool EvaluateIsValid()
  {
    return ((ICustomQueryStringValidator)
      System.Web.HttpContext.Current.Handler).QueryStringValidate();
  }
}

L'ultimo step è sempre quello di registrare l'HttpModule nel Web.config.

<add name="QueryString"
type=" HttpModulesByExample.QueryStringValidator.QueryStringValidatorModule,
HttpModuleByExample"/>

Applicazione offline

Spesso si ha l'esigenza di portare l'applicazione offline per i motivi più disparati, manutenzione, aggiornamento, problemi hardware, ecc. ASP.NET 2.0 ha introdotto una nuova feature che permette di portare l'applicazione offline semplicemente inserendo nella root il file App_Offline.htm. Non appena questo file viene inserito, l'applicazione viene arrestata, l'AppDomain scaricato ed ogni richiesta reindirizzata direttamente al file in questione.

Questa soluzione è molto comoda in situazioni dove si ha a disposizione un ambiente di collaudo speculare a quello di produzione e quindi i test in quest'ultimo sono minimi o inesistenti. Nelle altre situazioni, occorre fare sempre un test in produzione e quindi permettere solo a determinate utenze di accedere all'applicazione negando l'accesso agli altri. Questo purtroppo non è previsto nella soluzione attuale in quanto ogni richiesta viene reindirizzata senza alcuna distinzione.

Anche in questo caso un HttpModule può tornare utile in quanto, invece di utilizzare la feature standard di ASP.NET, si può creare una sezione del web.config dove impostare lo stato dell'applicazione (Online-Offline) e quali indirizzi IP possono accedervi mentre questa è offline.

public void Init(HttpApplication context)
{
  context.PostMapRequestHandler +=
    new EventHandler(context_PostMapRequestHandler);
}

void context_PostMapRequestHandler(object sender, EventArgs e)
{
  OfflineConfigurationElement config = (OfflineConfigurationElement)
    System.Configuration.ConfigurationManager.GetSection("Offline");
  if (config.IsOffline && System.Web.HttpContext.Current.Handler is Page)
  {
    string fullOfflinePage = String.Empty;
    if (System.Web.HttpContext.Current.Request.ApplicationPath.Length==1)
    {
      fullOfflinePage =
        System.Web.HttpContext.Current.Request.ApplicationPath +
        config.OfflinePage;
    }
    else
    {
      fullOfflinePage =
        System.Web.HttpContext.Current.Request.ApplicationPath +
        "/" + config.OfflinePage;
    }
    if (String.Compare(
      System.Web.HttpContext.Current.Request.Path,
      fullOfflinePage, true) != 0)
    {
      bool userIsAllowed = false;
      foreach (string ip in config.IP.Split(','))
      {
        if (System.Web.HttpContext.Current.Request.UserHostAddress==
          ip.Trim())
        {
          userIsAllowed = true;
          break;
        }
      }
      if (!userIsAllowed)
        System.Web.HttpContext.Current.Response.Redirect(
          config.OfflinePage);
    }
  }
}

In questo caso si interviene sull'evento PostMapRequestHandler per essere sicuri di gestire solo le richieste di una pagina. Il codice è molto simile a quello visto nella gestione dell'errore, infatti si verifica che l'IP del client sia presente nella lista inserita nel web.config e, in caso negativo, si viene reindirizzati alla pagina di offline stabilita in fase di configurazione.

Conclusioni

In questo articolo si è visto come sfruttare al meglio la natura modulare a pipeline di ASP.NET al fine di inserire logica applicativa per il trattamento delle richieste con un conseguente aumento della velocità di sviluppo. Infatti riutilizzare gli HttpModule in tutte le applicazioni permette di avere già molte feature comuni e di concentrarsi solo sul codice realmente necessario all'applicazione.

Dando uno sguardo al futuro, con IIS7 gli HttpModule sono stati portati ad un livello superiore ed integrati direttamente nel web server in modo tale da poter avere moduli generici per tutte le applicazioni. Questo, ad esempio, può semplificare le tecniche di Single Sign-On, o, addirittura, permette la realizzazione di moduli in un linguaggio managed da utilizzare in applicazioni realizzate in altre tecnologie (JSP, PHP, ecc.) e hostate in IIS.

3 pagine in totale: <<Indietro 1 2 [3]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC