我希望拥有一个非常轻量级的ASP.NET MVC网站,其中包括尽可能删除常规的HttpModules并禁用会话状态。然而,当我尝试这样做时,我遇到了以下错误:
SessionStateTempDataProvider需要启用SessionState。
我已在web.config中禁用了会话状态:
<sessionState mode="Off" />
我理解ASP.NET MVC在TempData中使用了会话状态,但我不需要/不想要TempData——我只想禁用会话状态。请帮忙!
我希望拥有一个非常轻量级的ASP.NET MVC网站,其中包括尽可能删除常规的HttpModules并禁用会话状态。然而,当我尝试这样做时,我遇到了以下错误:
SessionStateTempDataProvider需要启用SessionState。
我已在web.config中禁用了会话状态:
<sessionState mode="Off" />
我理解ASP.NET MVC在TempData中使用了会话状态,但我不需要/不想要TempData——我只想禁用会话状态。请帮忙!
你可以创建自己的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());
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();
}
}
我非常希望能够通过配置完全实现这一点,但目前这种方法也可以。
如果您需要使用TempData来存储简单的字符串,您可以在MvcFutures中使用CookieTempDataProvider http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471。
现代解决方案:
在ASP.NET中,如果您不使用Session对象存储任何数据或处理任何Session事件(Session_OnStart或Session_OnEnd),则会禁用会话状态。
因此,不使用Session(或TempData)将禁用会话状态。