web-dev-qa-db-fra.com

Comment puis-je désactiver l'état de session dans ASP.NET MVC?

Je voudrais avoir un site MVC ASP.NET très léger qui inclut la suppression d'autant de HttpModules habituels que possible et la désactivation de l'état de session. Cependant, lorsque j'essaie de le faire, j'obtiens l'erreur suivante:

The SessionStateTempDataProvider requires SessionState to be enabled.

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

<sessionState mode="Off" />

Je comprends qu'ASP.NET MVC utilise l'état de session pour TempData, mais je n'ai pas besoin/je veux TempData - je veux juste désactiver l'état de session. Aidez-moi!

76
Daniel Schaffer

Vous pouvez créer votre propre ControllerFactory et DummyTempDataProvider. Quelque chose comme ça:

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 il vous suffirait alors d'enregistrer la fabrique de contrôleurs au démarrage de l'application - par exemple vous pouvez le faire dans global.asax:

ControllerBuilder.Current.SetControllerFactory(new NoSessionControllerFactory());
47
Steve Willcock

J'ai trouvé un moyen, que je n'apprécie pas particulièrement:

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

Écraser manuellement le fournisseur dans le contrôleur

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

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

9
Daniel Schaffer

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

6
Haacked

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

1
Raleigh Buckner