Il TempDataProvider di ASP.NET MVC

Con il Framework ASP.NET MVC è stato introdotto il TempDataProvider che, come fa ben intuire il suo nome, ha lo scopo di memorizzare delle informazioni temporanee tra una chiamata e la successiva. Infatti, se si prova ad immaginare un ciclo di navigazione di tre pagine (A,B e C), dalla pagina C non si può accedere alle informazioni aggiunte al TempDataProvider della pagina A, ma solo a quelle della pagina B.

Di default queste informazioni vengono memorizzate nella Session e, anche se il TempDataProvider non viene utilizzato, se si prova a disabilitare la Sessione tramite l’apposita riga del file di configurazione, verrà sollevato un’errore dall’applicazione tipo il seguente:

The SessionStateTempDataProvider requires SessionState to be enabled.

Questo avviene perchè, all’interno della classe Controller (System.Web.Mvc.Controller) nel metodo Get, viene restituita (nel caso non fosse stato impostato un TempDataProvider differente) un’istanza della classe SessionStateTempDataProvider, e ne verrà invocato il metodo Load all’interno del metodo ExecuteCore del Controller.

Per capirne meglio il funzionamento basta guardare lo snippet seguente:

public ITempDataProvider TempDataProvider
{
     get
     {
         if (this._tempDataProvider == null)
         {
           this._tempDataProvider = new SessionStateTempDataProvider();
         }

         return this._tempDataProvider;
     }
     set
     {
         this._tempDataProvider = value;
     }
}
protected override void ExecuteCore()
{
  base.TempData.Load(base.ControllerContext, this.TempDataProvider);

  //…
}

Se si ha la fortuna (o sfortuna, in base ai punti di vista) di sviluppare applicazioni che hanno come requisito il funzionamento in una server farm, la sessione non può essere utilizzata (salvo uso di frameowrk particolari), ed il provider deve essere sostituito con qualcosa di più estensibile.

Per poter rispettare il requisito è necessario impostare un TempDataProvider nel metodo Inizialize del Controller con una classe sostitutiva, come mostrato di seguito:

protected override void Initialize(RequestContext requestContext)
{
  TempDataProvider = new CookieTempDataProvider(requestContext.HttpContext);
  base.Initialize(requestContext);
}

Il custom provider dovrà implementare l’interfaccia ITempDataProvider che richiede i seguenti metodi:

  • LoadTempData;
  • SaveTempData;

Il primo verrà invocato nel momento in cui si vogliono recuperare delle informazioni dal repository, il secondo quando si vogliono aggiungere delle informazioni al repository.
Se non si ha la necessità di memorizzare grandi quantità di informazioni nel TempDataProvider, sicuramente può essere utile memorizzarle in un cookie.
Di fatto, su codeplex nelle ASP.NET MVC Futures, si trova un’implementazione di un TempDataProvider che utilizza proprio il cookie come repository (maggiori info qui: http://aspnet.codeplex.com/SourceControl/changeset/view/21528#266402).


Comments