【问题标题】:Why would ASP.NET MVC use session state?为什么 ASP.NET MVC 会使用会话状态?
【发布时间】:2010-09-28 01:52:20
【问题描述】:

由 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>; 

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

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

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

【问题讨论】:

  • 您能否提供一个链接,指向他们所说的“使用缓存而不是会话”,因为它们并不是真正意义上的同一件事?
  • 如果我没记错的话,我是在 2005 年 9 月的 MSDN 杂志上读到的。也许我应该说得更好,但我们完全不使用会话。
  • 他说:“Tip: Disable session state when not in use.”,很少有没有在认证区域使用的会话。
  • 如果 Scott 链接不再起作用。
  • 顺便说一句,可以阅读 2005 年 9 月号 MSDN 杂志上关于会话状态的文章here -- 请注意它指的是 ASP.NET 2.0 的预发布版本跨度>

标签: asp.net-mvc session-state


【解决方案1】:

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

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

【讨论】:

  • 知道这是一个老问题,但这个答案(在较小程度上也是所有其他问题)忽略了 OP 正在使用 WebFarm 基础架构这一事实,这意味着在使用 SQL Server(对于该任务来说非常慢)或专用的网络共享 Windows 服务(这在 a** 中很痛苦)来保持该会话 - 所以缓存可能确实是一个更好的选择。
【解决方案2】:

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

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

【讨论】:

  • 顺便说一句,为什么将用户特定的数据存储到缓存中会导致不良行为?如果您为每个用户正确获取了缓存密钥,我看不出这是什么问题。
  • 因为缓存根据定义是易失的。有些情况是您无法控制的,例如内存压力,缓存可能会失效,从而丢失所有会话数据。
  • "默认情况下,ASP.NET 应用程序将会话状态存储在工作进程的内存中,特别是缓存对象的私有槽中。" - MSDN (msdn.microsoft.com/en-us/library/aa479041.aspx)
【解决方案3】:

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

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

【讨论】:

  • 这在循环网络场配置中如何工作?有没有办法在 MVC 中关闭 Session State/TempData?
  • 它的工作方式与会话始终在服务器场上工作的方式相同。这记录在 MSDN 上。最好的方法是使用分布式缓存,但您也可以使用“粘性会话”。关于关闭会话,它就像任何其他 ASP.NET 应用程序一样。请参阅 MSDN。然后就不要使用 TempData。也就是说,这样做就像通过斩首治疗痤疮。
  • 可以通过在 web.config 中禁用并实现 ITempDataProvider 接口来禁用会话状态。
  • @Craig 该死的你。刚刚写了一个问题,并在再次检查重复项时找到了答案。浪费了约 15 分钟... xD
  • Santose:在 MVC 1 中,在下一个请求上。在 MVC 2 beta + 中,下次读取时。
【解决方案4】:

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

这里有一些指向资源的指针 TempData

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2010-12-13
    • 2011-06-07
    相关资源
    最近更新 更多