2009-05-19 28 views
75

Mi piacerebbe avere un sito MVC ASP.NET molto leggero che include la rimozione del maggior numero possibile di HttpModules e la disabilitazione dello stato della sessione. Tuttavia quando provo a fare questo, ottengo il seguente errore:Come posso disabilitare lo stato della sessione in ASP.NET MVC?

The SessionStateTempDataProvider requires SessionState to be enabled.

ho disabilitato lo stato della sessione in web.config:

<sessionState mode="Off" /> 

Capisco che utilizza ASP.NET MVC sessione stato per TempData, ma non ho bisogno/voglio TempData - Voglio solo disabilitare lo stato della sessione. Aiuto!

+0

Bella idea - sarei interessato a sapere se hai riscontrato altri problemi con questo e quanto leggero sei stato in grado di ottenere alla fine. –

+0

Non ho fatto molti più esperimenti dopo aver implementato le modifiche di Steve, ma c'era ancora un bel po 'di spese generali. Il più veloce che ho potuto ottenere con ASP.NET è stato con le implementazioni dirette IH HTTPHandler. Vedere la mia risposta qui per maggiori informazioni: http://stackoverflow.com/questions/509978/something-faster-than-httphandlers/510001#510001 –

+26

Questo problema è stato risolto in MVC 2. Abbiamo risolto il provider di dati temporanei dello stato sessione che ha vinto Non lanciare se non si tenta effettivamente di leggere/scrivere i dati temporanei. –

risposta

47

È possibile creare ControllerFactory e DummyTempDataProvider personalizzati. Qualcosa del genere:

public class NoSessionControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
    var controller = base.GetControllerInstance(controllerType); 
    ((Controller) controller).TempDataProvider = new DummyTempDataProvider(); 
    return controller; 
    } 
} 


public class DummyTempDataProvider : ITempDataProvider 
{ 
    public IDictionary<string, object> LoadTempData(ControllerContext controllerContext) 
    { 
    return new Dictionary<string, object>(); 
    } 

    public void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) 
    { 
    } 
} 

E quindi sarebbe sufficiente registrare il controller di fabbrica all'avvio dell'app - ad es. si potrebbe fare questo in global.asax:

ControllerBuilder.Current.SetControllerFactory(new NoSessionControllerFactory()); 
+1

Grazie ... ancora non ideale (almeno per me), ma comunque meglio che farlo su ogni controller. –

+10

Scusa, sembrava davvero ingrato ... non voleva dire che fosse: D –

+2

hehe, nessun problema :) Capisco che potrebbe sembrare più codice di quello che vorresti idealmente per quello che sembra dovrebbe essere una cosa configurabile , ma uno dei punti di forza di ASP.NET MVC è questo tipo di configurazione attraverso la fornitura di implementazioni alternative tramite codice.Ti dà un sacco di energia per entrare e fare le cose come vuoi e nel complesso direi che è davvero una "cosa buona". Personalmente preferisco digitare il codice C# piuttosto che xml in ogni caso;) –

9

ho trovato un modo, che non mi interessa particolarmente per:

Crea NoTempDataProvider

using System; 
using System.Collections.Generic; 
using System.Web.Mvc; 

namespace Facebook.Sites.Desktop.Auth.Models 
{ 
    public class NoTempDataProvider : ITempDataProvider 
    { 
     #region [ ITempDataProvider Members ] 

     public IDictionary<String, Object> LoadTempData(ControllerContext controllerContext) 
     { 
      return new Dictionary<String, Object>(); 
     } 

     public void SaveTempData(ControllerContext controllerContext, IDictionary<String, Object> values) { } 

     #endregion 
    } 
} 

sovrascrivere manualmente il provider nel controller

public class AuthController : Controller 
{ 
    public AuthController() 
    { 
     this.TempDataProvider = new NoTempDataProvider(); 
    } 
} 

Preferisco di gran lunga un modo per farlo completamente tramite la configurazione, ma questo funziona per ora.

+3

Sì, il tuo modo è simile al modo in cui ho delineato nella mia risposta, sebbene non sia necessario sovrascrivere manualmente il TempDataProvider in ciascun controller se fornisci un controller personalizzato personalizzato per gestirlo per te. –

+4

È inoltre possibile creare una classe Controller di base e configurare TempDataProvider nel suo costruttore. – Brannon

1

Secondo Brad Wilson, questo è stato corretto nell'anteprima MVC 2 1. Vedere here e here.

Problemi correlati