【问题标题】:How can I disable session state in ASP.NET MVC?如何在 ASP.NET MVC 中禁用会话状态?
【发布时间】:2010-10-27 10:59:13
【问题描述】:

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

The SessionStateTempDataProvider requires SessionState to be enabled.

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

<sessionState mode="Off" />

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

【问题讨论】:

  • 好主意 - 我很想知道您是否遇到任何其他问题,以及您最终能够获得多轻量级。
  • 在实施史蒂夫的更改后,我没有做更多的实验,但仍然有相当多的开销。我能够让 ASP.NET 运行的最快速度是直接使用 IHttpHandler 实现。请在此处查看我的答案以获取更多信息:stackoverflow.com/questions/509978/…
  • 这在 MVC 2 中已修复。我们修复了会话状态临时数据提供程序,除非您实际尝试读取/写入临时数据,否则它不会抛出。
  • 布拉德:太好了,很高兴知道!

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


【解决方案1】:

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

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

我非常希望有一种完全通过配置完成此操作的方法,但目前可行。

【讨论】:

  • 是的,您的方式类似于我在回答中概述的方式 - 尽管如果您提供自定义 ControllerFactory 来为您处理它,您不必手动覆盖每个控制器中的 TempDataProvider。
  • 您也可以创建一个基本的Controller类,并在它的构造函数中配置TempDataProvider。
【解决方案2】:

您可以制作自己的 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());

【讨论】:

  • 谢谢...仍然不理想(至少对我而言),但仍然比在每个控制器上都这样做更好。
  • 对不起,这听起来真的很忘恩负义......并不是说要这样:D
  • 呵呵,没问题 :) 我知道它可能看起来比你理想中的代码更多,因为它看起来应该是一个可配置的东西,但它是 ASP.NET MVC 的一大优势是通过代码提供替代实现的这种类型的配置。它给了你很大的力量来进入那里并按照你想要的方式做事,总的来说,我会说这真的是一件“好事”。就个人而言,我更喜欢输入 C# 代码而不是 xml ;)
  • 嗨史蒂夫。我刚刚在我的项目中实现了你的代码。它运作良好。谢谢!现在我禁用了会话。
  • 我在 SaveTempData 方法中的解决方案中又添加了一件: if ( values.Count != 0 ) throw new NotImplementedException("Can not set tempdata, no session state available"); tinyurl.com/mbegfr
【解决方案3】:

如果需要对简单字符串使用TempData,可以使用MvcFutures中的CookieTempDataProviderhttp://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      现代解决方案:

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

      所以不使用 Session(或 TempData),会禁用 Session State。

      Source

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 2010-11-09
        相关资源
        最近更新 更多