2013-04-08 79 views
5

我打算在MVC3中使用一个简单的会话对象来维护像RecordIds这样的状态数据,而不是将它们传递到所有客户端页面,这很麻烦。将会话对象填充一次直到不再使用似乎简单得多。在MVC中使用会话对象,它真的很糟糕吗?

那么这是可以接受的做法还是作弊?

非常感谢。

+1

我投票结束这个,因为它会征求专家意见和反对意见的辩论。它不适合QA。这就是说,有这样的一些类似的问题:http://stackoverflow.com/questions/10181629/why-session-is-a-disaster-in-asp-net-mvc-application和http://stackoverflow.com/questions/6165241/asp-net-mvc-session – Jamiec 2013-04-08 11:48:57

回答

7

使用Session对象没有任何问题。通常人们避免它们来减少服务器上的负载;但如果你是小心,不要试图把大量的数据放在那里,并没有太多(多少取决于你的服务器),那么这是一个可以接受的做法。

有关使用会话的潜在缺点一些信息退房the answerStill ok to use Session variables in ASP.NET mvc, or is there a better alternative for some things (like a cart)

+0

谢谢,很有帮助。我一直认为它就像在编码中使用“GoTo”语句一样。似乎没有在正确的背景下。 – SamJolly 2013-04-08 11:58:16

+0

购物车的好例子。实际上,我将数据传递给工作流程,但每个工作流程步骤都可能访问另一个控制器来完成其工作。 – SamJolly 2013-04-08 11:59:59

6

就像在开发者的生活中的一切,用会话的权衡,以及恕我直言,它通常是一个糟糕的一个。

会话状态不仅会导致服务器上的负载增加并且会产生可伸缩性障碍(这两个问题都可以 - 部分地通过将状态服务器或sql server存储为会话变量来解决),它有一个设计怪癖,大家都知道:它在会话上保持读写锁定。 (http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx

这意味着默认情况下,同一用户不能发出两个并发请求。这种行为是与asp.net相关的(不仅仅是asp.net MVC),但是由于asp.net MVC真的鼓励你走下ajax之路,你会更频繁地看到这个问题)。

您可以通过巧妙地使用readonly session state or selectively disabling it来避开这些问题,但是从我的经验来说,这会产生开发开销,因为该属性只能在类作用域中声明,而不能用于特定的操作方法,这会导致您拆分逻辑单元通常会在一起。

总之,您的荣誉,asp.net会话状态默认行为是有问题的。尽可能避免使用它。

+1

您的证据已获得您的好评!法院现在休会以结束其发现:) – SamJolly 2013-04-08 16:39:15

相关问题