2009-05-19 13 views
75

Me gustaría tener un sitio ASP.NET MVC muy liviano que incluye eliminar la mayor cantidad posible de los HttpModules y deshabilitar el estado de la sesión. Sin embargo cuando intento hacer esto, me sale el siguiente error:¿Cómo puedo desactivar el estado de la sesión en ASP.NET MVC?

The SessionStateTempDataProvider requires SessionState to be enabled.

he estado de sesión con discapacidad en web.config:

<sessionState mode="Off" /> 

entiendo que ASP.NET MVC utiliza sesión estado para TempData, pero no necesito/quiero TempData - Solo quiero desactivar el estado de la sesión. ¡Ayuda!

+0

Buena idea: me interesaría saber si se encontró con algún otro problema con esto y qué tan liviano fue capaz de obtener al final. –

+0

No hice mucha más experimentación después de implementar los cambios de Steve, pero todavía había una buena cantidad de sobrecarga. Lo más rápido que he podido conseguir ASP.NET ha sido con implementaciones directas de IHttpHandler. Consulte mi respuesta aquí para obtener más información: http://stackoverflow.com/questions/509978/something-faster-than-httphandlers/510001#510001 –

+26

Esto se corrigió en MVC 2. Reparamos el proveedor de datos temporales del estado de la sesión que ganó tirar a menos que realmente intente leer/escribir los datos de la temperatura. –

Respuesta

47

Puede crear su propio ControllerFactory y DummyTempDataProvider. Algo como esto:

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) 
    { 
    } 
} 

Y luego solo necesita registrar la fábrica del controlador al iniciar la aplicación, por ejemplo. usted puede hacer esto en global.asax:

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

Gracias ... todavía no es ideal (al menos para mí), pero aún mejor que hacerlo en cada controlador. –

+10

Disculpa, eso sonaba realmente ingrato ... no significaba que fuera: D –

+2

jeje, no hay problema :) Entiendo que podría parecer más código del que idealmente deseas para lo que parece debería ser una cosa configurable , pero una de las grandes fortalezas de ASP.NET MVC es este tipo de configuración al proporcionar implementaciones alternativas a través del código.Te da mucho poder para entrar y hacer las cosas como quieras y, en general, diría que es realmente una "cosa buena". Personalmente prefiero escribir el código C# que xml de todos modos;) –

9

he encontrado una manera, que particularmente no me importa para:

Crear 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 
    } 
} 

Sobrescribir manualmente el proveedor en el controlador

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

Preferiría mucho una manera de hacer esto completamente a través de la configuración, pero esto funciona por ahora.

+3

Sí, su forma de proceder es similar a la que describí en mi respuesta, aunque no tiene que anular manualmente TempDataProvider en cada controlador si proporciona un ControllerFactory personalizado para manejarlo por usted. –

+4

También puede crear una clase base de Controlador y configurar TempDataProvider en su constructor. – Brannon

1

De acuerdo con Brad Wilson, esto se ha corregido en MVC 2 Preview 1. Ver here y here.

Cuestiones relacionadas