为什么Session是ASP.NET MVC应用程序中的灾难?

Hap*_*ppy 36 session-state asp.net-mvc-3

为什么说我们不应该在ASP.NET MVC应用程序中使用Session变量?我偶然发现了这个答案.在这种情况下,我将如何维护诸如登录用户信息和与其帐户相关的一些相关数据等请求的值?

这是达林的回答.

为什么在ASP.NET MVC应用程序中使用HttpContext.Current?永远不要使用它.即使在经典的ASP.NET webforms应用程序中,这也是邪恶的,但在ASP.NET MVC中,这是一个让这个漂亮的Web框架带来所有乐趣的灾难.

Rob*_*vey 28

ASP.NET MVC等框架的基本原则之一是它们是无状态的,就像Web一样.ASP.NET Web Forms试图模仿无状态环境中的有状态范例.换句话说,这是一个谎言.

在ASP.NET MVC应用程序中使用Session变量有点像将一个号角绑在马的头上,并将其称为Unicorn.

  • 我仍然没有看到任何不使用会话状态的理由.有时我需要跨请求存储数据,那么如果没有会话我将如何做到这一点?当然,我可以将它们存储在数据库中.但是我从中获得了什么? (20认同)
  • 你能解决这部分问题吗?`我将如何维护请求中的值?显然我也是这样做的...... (17认同)
  • 有会话,概念和ASP.NET类的`Session`.应该尽可能避免后者,但前者只是HTTP上的状态层.虽然ASP.NET auth不使用`Session`,但它非常*使用会话. (7认同)
  • @Happy:ASP.NET MVC维护请求之间的登录状态.请参阅http://www.asp.net/mvc/tutorials/older-versions/security/authenticating-users-with-forms-authentication-cs (4认同)
  • @asawyer:这意味着如果我使用我的凭据登录mysite.com,我必须每次都在发送用户名吗?真的吗?在这种情况下,我可以通过发送您的用户名来获取您的信息.没门 ! (3认同)

小智 7

您可以使用会话状态来保存数据,TempData功能使用Session作为默认值来保存数据.

您应该尽可能地减少会话的使用,原因是会话对所有请求进行锁定以防止会话状态损坏,例如多个Ajax请求将因此而串行化.更多信息在这里

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

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