【问题标题】:Why Session is a disaster in ASP.NET MVC application?为什么 Session 在 ASP.NET MVC 应用程序中是一场灾难?
【发布时间】:2012-04-28 05:25:16
【问题描述】:

为什么说我们不应该在 ASP.NET MVC 应用程序中使用 Session 变量?我遇到了this answer,它是这么说的。在这种情况下,我将如何维护请求中的值,例如登录用户信息和与他的帐户关联的一些相关数据?

这是Darin的回答。

为什么在 ASP.NET MVC 应用程序中使用 HttpContext.Current? 永远不要使用它。即使在经典的 ASP.NET 网络表单中,这也是邪恶的 应用程序,但在 ASP.NET MVC 中,这是一场灾难,带来了所有的乐趣 脱离了这个漂亮的网络框架。

【问题讨论】:

  • 我没有说你不应该使用 Session (实际上我说过而且我现在正在说它,但不是在你链接到的答案中)。我说过你不应该使用HttpContext.Current 来访问当前的HTTP 上下文。
  • 这里有一篇文章解释了为什么使用 HttpContext.Current 是一个坏主意的一个原因 - 基本上它不是线程安全的:odetocode.com/articles/112.aspx

标签: asp.net-mvc-3 session-state


【解决方案1】:

像 ASP.NET MVC 这样的框架的基本原则之一是它们是无状态,就像 Web 一样。 ASP.NET Web 窗体是在无状态环境上模仿有状态范式的尝试。换句话说,It is a lie

在 ASP.NET MVC 应用程序中使用 Session 变量有点像把牛角绑在马的头上,并称它为独角兽。

【讨论】:

  • 你能解决这部分问题吗? how will i maintain the values across requests ?显然我这样做也非常错误......
  • @asawyer:这意味着如果我使用我的凭据登录 mysite.com,我每次都必须在 url 中发送 myusername 吗?真的吗 ?在这种情况下,我可以通过发送您的用户名来获取您的信息。没办法!
  • @Happy:ASP.NET MVC 维护请求之间的登录状态。见asp.net/mvc/tutorials/older-versions/security/…
  • 我仍然看不到任何不使用会话状态的理由。有时我需要跨请求存储数据,那么我将如何在没有会话的情况下做到这一点?当然,我可以将它们存储在数据库中。但是我能从中得到什么?
  • 有会话、概念和Session ASP.NET 类。后者应尽可能避免,但前者只是 HTTP 上的状态层。虽然 ASP.NET 身份验证不使用 Session,但它非常确实使用会话。
【解决方案2】:

您可以使用会话状态来持久化数据,TempData 功能默认使用 Session 来持久化数据。

您应该尽可能减少 session 的使用,原因是所有请求都对 session 进行锁定以防止 session 状态损坏,例如多个 Ajax 请求将因此而序列化。更多信息here

您可以使用替代方法在请求之间保留数据,例如您可以使用 CookieValueProvider,它是 MVC Futures 的一部分,用于将 cookie 数据绑定到模型。您也可以将数据作为隐藏字段保存在实际 DOM 中,但同样应尽可能地减少这些数据的大小,因为数据的大小将反映在进出浏览器的网络流量中。

如果您的主存储很慢,我会考虑为您的 Web 应用程序使用另一个数据存储。例如 SQLServer CE 或嵌入式 RavenDB。

【讨论】:

  • 它们会同步而不是序列化。
  • 并行请求的同步导致序列化(一个接一个)
  • 要明确一点,串行事件是一个接一个的,串行化一般是指将内存中的数据,以一种可以存储到磁盘的格式放入。
  • 序列化并不意味着一个接一个。我认为您正在寻找的词是“顺序的”,其中多个过程一个接一个地发生。序列化是指将对象转换为原始字节以用于“通过流发送它们”或“tcp/ip 套接字连接”,或将它们存储在磁盘上等。我认为上下文中的正确词是序列化,其中一个并行的算法或过程变成了一系列的顺序过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 2013-10-26
  • 2017-03-22
  • 2010-11-06
  • 2012-12-31
相关资源
最近更新 更多