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

时间:2009-05-19 20:28:05

标签: asp.net-mvc session-state tempdata

我希望有一个非常轻量级的ASP.NET MVC站点,其中包括尽可能多地删除常用的HttpModule并禁用会话状态。但是,当我尝试这样做时,我收到以下错误:

The SessionStateTempDataProvider requires SessionState to be enabled.

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

<sessionState mode="Off" />

我理解ASP.NET MVC使用TempData的会话状态,但我不需要/想要TempData - 我只是想禁用会话状态。救命啊!

5 个答案:

答案 0 :(得分:47)

您可以创建自己的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)
  {
  }
}

然后你只需要在app启动时注册控制器工厂 - 例如你可以在global.asax中执行此操作:

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

答案 1 :(得分:9)

我找到了一种方法,我并不特别关心:

创建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();
    }
}

我非常希望通过配置完全实现这一点,但现在可以使用。

答案 2 :(得分:6)

如果您需要将TempData用于简单字符串,则可以在MvcFutures http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471中使用CookieTempDataProvider。

答案 3 :(得分:1)

根据Brad Wilson的说法,这已在MVC 2 Preview 1中得到修复。请参阅herehere

答案 4 :(得分:0)

现代解决方案:

在ASP.NET中,如果不使用Session对象存储任何数据,或者 如果任何会话事件(Session_OnStart或Session_OnEnd)为 处理后,会话状态被禁用。

因此,不使用会话(或TempData),则会禁用会话状态。

Source