我想具有包括去除尽可能多的通常的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

据布拉德威尔逊,这已被固定在MVC 2预览1.见这里这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top