2012-04-16 43 views
32

为什么这么说我们不应该在ASP.NET MVC应用程序中使用会话变量?我遇到了this answer这样说。在那种情况下,我将如何维护登录用户信息和与其账户相关的一些相关数据等请求中的值?为什么会话在ASP.NET MVC应用程序中是一场灾难?

这是Darin的答案。

为什么在ASP.NET MVC应用程序中使用HttpContext.Current? 千万不要使用它。即使在传统的ASP.NET webforms 应用程序中,这也是邪恶的,但在ASP.NET MVC中,这是一个灾难,它将这个漂亮的web框架中的所有有趣的 都带走了。

+13

我不说,你不应该使用Session(其实我说过,我说的是正确的,但现在不是在您链接到的答案)。我说过你不应该使用'HttpContext.Current'来访问当前的HTTP上下文。 – 2012-04-16 21:08:36

+0

这里有一篇文章解释了为什么使用HttpContext.Current是一个坏主意的原因 - 基本上它不是线程安全的:http://odetocode.com/articles/112.aspx – JTech 2016-09-15 07:54:18

回答

27

一个像ASP.NET MVC框架的基本原则是,他们无国籍,就像网络是。 ASP.NET Web窗体试图模仿无状态环境的有状态范例。换句话说,It is a lie。在ASP.NET MVC应用程序

使用Session变量有点像绑喇叭一匹马的头,称这是一个独角兽。

+16

你能解决这部分问题吗? '我将如何维护请求中的值?显然我这样做是非常错误的... – asawyer 2012-04-16 21:10:52

+1

将它们存储在您的数据库中。您应该查看http://www.asp.net/mvc上的教程,尤其是NerdDinner教程。 – 2012-04-16 21:11:16

+1

在我的特殊情况下的后备存储有时会非常非常慢,打它的每个动作仅仅是行不通=/ – asawyer 2012-04-16 21:13:32

5

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

您应该尽可能减少会话的使用,原因是所有请求都会在会话中发生锁定,以防止会话状态被破坏,例如多个Ajax请求会因此而连续出现。更多信息here

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

我会考虑使用其他的数据存储为Web应用程序,如果你的主存储是缓慢的。例如SQLServer CE或嵌入的RavenDB。

+0

他们会同步不序列化。 – KingOfHypocrites 2014-07-28 14:00:07

+0

并行请求的同步导致序列化(一个接一个) – 2015-08-31 16:12:07

+0

要清楚,串行事件是一个接一个的,序列化通常指的是何时将数据存入内存并将其放入可存储到磁盘的格式。 – mikeschuld 2016-07-26 17:18:49

相关问题