我如何在ASP.NET MVC中禁用会话状态?
-
23-08-2019 - |
题
我想具有包括去除尽可能多的通常的HttpModules尽可能和禁用会话状态的一个非常轻量级的ASP.NET MVC位点。然而,当我尝试这样做,我得到以下错误:
The SessionStateTempDataProvider requires SessionState to be enabled.
我在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());
其他提示
我已经找到一种方法,我并不特别在意的:
创建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
}
}
手动覆盖在控制器提供商强>
public class AuthController : Controller
{
public AuthController()
{
this.TempDataProvider = new NoTempDataProvider();
}
}
我会非常喜欢的方式完全通过配置来做到这一点,但这个工程现在。
如果您需要使用TempData的简单的字符串,你可以使用CookieTempDataProvider在MvcFutures的 http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471 。
不隶属于 StackOverflow