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。
答案 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