为什么ASP.NET MVC会使用会话状态?

时间:2008-12-22 19:41:06

标签: asp.net-mvc session-state

ASP.NET团队建议使用缓存而不是会话,我们在过去几年中停止使用会话来处理WebForm模型。所以我们通常在web.config中关闭会话

<sessionState mode="Off" />

但是,现在当我使用此设置测试ASP.NET MVC应用程序时,它会在mvc框架内的类SessionStateTempDataProvider中抛出错误,它要求我打开会话状态,我做了它工作。查看它使用会话的来源:

// line 20 in SessionStateTempDataProvider.cs
Dictionary<string, object> tempDataDictionary = 
httpContext.Session[TempDataSessionStateKey] as Dictionary<string, object>; 

那么,为什么他们会在这里使用会话?我错过了什么?

=============================================== =========

编辑很抱歉,这篇文章对于会话与缓存的争论并不意味着,而是在ASP.NET MVC的上下文中,我只是想知道为什么会话在这里使用。在这个blog post中,Scott Watermasysk提到关闭会话是一个很好的做法,所以我只是想知道为什么我必须从这里开启使用MVC。

4 个答案:

答案 0 :(得分:33)

会话用于TempData商店。 TempData是一种高度有限的会话状态,它将持续到某个用户的下一个请求为止。 (编辑在MVC 2+中,它会持续到下次读取为止。)TempData的目的是存储数据,然后执行重定向,并使存储的数据可用于您执行的操作刚重定向。

对TempData存储使用Session意味着已经处理Session的任何分布式缓存系统都适用于TempData。在TempData执行时避免直接使用Session有几个优点。一个是你不必自己清理会话; TempData将自行“过期”。

答案 1 :(得分:13)

  

ASP.NET团队推荐使用   缓存而不是会话

@ ray247,您可以为此提供参考吗?会话和缓存本质上是不同的,应根据应用程序要求使用。例如,将用户特定数据存储到高速缓存中可能导致不期望的行为。当然,如果您真的想避免使用会话,您可以提供自己的 ITempDataProvider 接口实现。

答案 2 :(得分:6)

嗯...可能你已经读过关于持有重物或相对很少被访问的物体的信息 - 将它们放入缓存中肯定会更好,但对于轻物体或每次请求所需的数据都没有比将它们放入Session更好的技术。

如果你正确使用它们,会话就不是邪恶的。

答案 3 :(得分:3)

只是另外一个想法。 TempData有其自己的目的,MS知道TempData持久机制会有不同的思想流派。因此,默认情况下,它们将持久存储设置为SessionState。但设计仍然非常灵活。根据项目的需求和指导它的治理,您可以创建自己的tempdata提供程序以满足特定需求。

以下是资源的一些指示 TempData

以下是TempData实现的一些其他改进 TempData Improvements

这是使用MS Velocity分布式缓存的替代实现。 Velocity TempData Provider