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!
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());
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.
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 .