当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在ASP.NETMVC中禁用会话状态?》经验,为你挑选了3个好方法。

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

The SessionStateTempDataProvider requires SessionState to be enabled.

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


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



1> Steve Willco..:

您可以创建自己的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 LoadTempData(ControllerContext controllerContext)
  {
    return new Dictionary();
  }

  public void SaveTempData(ControllerContext controllerContext, IDictionary values)
  {
  }
}

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

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


对不起,这听起来真的很忘恩负义......并不意味着:D
我在SaveTempData方法中向我的解决方案添加了一个部分:if(values.Count!= 0)抛出新的NotImplementedException("无法设置tempdata,没有可用的会话状态"); http://tinyurl.com/mbegfr
呵呵,没问题:)我明白它看起来像你想要的东西似乎更多的代码应该是一个可配置的东西,但ASP.NET MVC的一大优势是这种类型的配置通过提供替代通过代码实现.它给你很大的力量进入那里,按照你想要的方式做事,总的来说,我认为这真的是一件好事.我个人更喜欢键入C#代码而不是xml;)

2> Daniel Schaf..:

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

创建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 LoadTempData(ControllerContext controllerContext)
        {
            return new Dictionary();
        }

        public void SaveTempData(ControllerContext controllerContext, IDictionary values) { }

        #endregion
    }
}

手动覆盖Controller中的提供程序

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

我非常喜欢通过配置完全做到这一点的方法,但现在这种方法很有用.


您还可以创建一个基本Controller类,并在其构造函数中配置TempDataProvider.
是的,您的方式类似于我在答案中概述的方式 - 如果您提供自定义ControllerFactory来为您处理它,则不必手动覆盖每个控制器中的TempDataProvider.

3> Haacked..:

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

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有