33

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

<sessionState mode="Off" />

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

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

那么,他们为什么要在这里使用 session 呢?我错过了什么?

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

编辑对不起,这篇文章并不是要讨论会话与缓存,而是在 ASP.NET MVC 的上下文中,我只是想知道为什么在这里使用会话。在这篇文中,Scott Watermasysk 还提到关闭会话是一种很好的做法,所以我只是想知道为什么我必须打开它才能从这里开始使用 MVC。

4

4 回答 4

33

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

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

于 2008-12-22T20:14:36.123 回答
13

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

@ray247,你能提供一个参考吗?Session 和 Cache 本质上是不同的,应该根据应用需求来使用。例如,将用户特定数据存储到缓存中可能会导致不良行为。当然,如果您真的想避免使用会话,您可以提供自己的ITempDataProvider接口实现。

于 2008-12-22T19:56:01.530 回答
6

嗯...可能您已经阅读过有关持久化重对象或相对很少访问的对象的内容 - 将它们放入缓存肯定更好,但对于轻对象或每次请求所需的数据,没有比这更好的技术了将它们放入会话中。

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

于 2008-12-22T19:54:28.787 回答
3

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

以下是一些指向资源 TempData

以下是 TempData 实现中的一些额外改进 TempData Improvements

这是使用 MS Velocity 分布式缓存的替代实现。 速度 TempData 提供程序

于 2010-04-17T05:18:33.440 回答