我如何禁用ASP.NET MVC中的会话状态?

我想有一个非常轻量级的ASP.NET MVC网站,其中包括尽可能多的删除通常的HttpModules和禁用会话状态。 但是,当我尝试做到这一点,我得到以下错误:

The SessionStateTempDataProvider requires SessionState to be enabled.

我在web.config中禁用了会话状态:

 <sessionState mode="Off" /> 

我知道ASP.NET MVC使用TempData的会话状态,但我不需要/需要TempData – 我只是想禁用会话状态。 帮帮我!

你可以创build自己的ControllerFactory和DummyTempDataProvider。 像这样的东西:

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

然后,你只需要在应用程序启动时注册控制器工厂 – 例如,你可以在global.asax中执行此操作:

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

我find了一个我不特别关心的方法:

创buildNoTempDataProvider

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

手动覆盖控制器中的提供程序

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

我会非常喜欢通过configuration完全做到这一点的方式,但现在这个工作。

如果你需要使用简单的stringTempData,你可以使用MvcFutures中的CookieTempDataProvider http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

根据Brad Wilson的说法,这已经在MVC 2 Preview 1中得到了修复。请看这里和这里 。