Question

Je voudrais avoir un site ASP.NET MVC très léger qui comprend le retrait le plus grand nombre des HttpModules habituelles que possible et la désactivation de l'état de session. Cependant, lorsque je tente de le faire, je reçois l'erreur suivante:

The SessionStateTempDataProvider requires SessionState to be enabled.

J'ai l'état de session désactivé dans web.config:

<sessionState mode="Off" />

Je comprends que ASP.NET MVC utilise l'état de session pour TempData, mais je ne ai pas besoin / voulez TempData - Je veux juste désactiver l'état de session. Aide!

Était-ce utile?

La solution

Vous pouvez faire votre propre ControllerFactory et DummyTempDataProvider. Quelque chose comme ceci:

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

Et alors vous juste besoin d'enregistrer l'usine de contrôleur au démarrage de l'application - par exemple vous pouvez le faire en global.asax:

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

Autres conseils

Je l'ai trouvé d'une manière que je ne me soucie pas particulièrement pour:

Créer 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
    }
}

manuellement Ecraser le fournisseur dans le contrôleur

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

Je préférerais grandement une façon de le faire complètement via la configuration, mais cela fonctionne pour l'instant.

Si vous devez utiliser TempData pour les chaînes simples, vous pouvez utiliser le CookieTempDataProvider dans MvcFutures http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471 .

Selon Brad Wilson, cela a été corrigé dans MVC 2 Aperçu 1. Voir ici et .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top