即使会话已禁用,也会调用SaveTempData

时间:2011-04-01 19:52:59

标签: asp.net-mvc-2 tempdata

我已经通过web.config在我的mvc2应用程序中禁用了sessionState,并且还创建了我自己的controllerfactory和虚拟tempdata提供程序,如下所述:

How can I disable session state in ASP.NET MVC?

只有我这样做才能使SaveTempData抛出异常:

 public void SaveTempData(ControllerContext controllerContext, 
                          IDictionary<string, object> values)
    {
        throw new NotImplementedException(
        "Cannot set tempdata, no session state is available.");
    }

我确保没有代码使用Session或TempData对象,但我仍然看到在引发“OnResultExecuted”事件后抛出此异常。我曾经在我的mvc1网站上使用这个相同的模式,从未见过异常。有什么想法吗?

如果我将“SaveTempData”实现更改为:

public void SaveTempData(ControllerContext controllerContext, 
                         IDictionary<string, object> values)
    {
        if (values.Count != 0)
        {
            throw new NotImplementedException(
            "Cannot set tempdata, no session state is available.");
        }
    }

一切都按预期工作 - 我只是希望了解为什么在我不在任何地方使用SaveTempData时都会调用它。

更新

发现了这篇文章:http://www.gregshackles.com/2010/07/asp-net-mvc-do-you-know-where-your-tempdata-is/

这解释了ExecuteCore围绕一个动作调用PossiblyLoadTempData和PossiblySaveTempData - 这就是造成我的问题的原因。这是mvc2与mvc1的新增加吗?

2 个答案:

答案 0 :(得分:1)

这是在Controller.ExecuteCore方法中实现的方式。始终在每个操作之前和之后调用LoadTempDataSaveTempData方法,因此请确保它们不会抛出异常。为了有效地禁用会话,我建议您将以下内容放在web.config中:

<sessionState mode="Off" />

答案 1 :(得分:1)

发现了这篇文章:http://www.gregshackles.com/2010/07/asp-net-mvc-do-you-know-where-your-tempdata-is/

这解释了ExecuteCore围绕一个动作调用PossiblyLoadTempData和PossiblySaveTempData - 这就是造成我的问题的原因。这是mvc2与mvc1的新增加吗?