【问题标题】:Static variable causing concurrency issue in mvc在 mvc 中导致并发问题的静态变量
【发布时间】:2014-12-09 06:42:39
【问题描述】:

我们使用 mvc4 开发 Web 应用程序。在许多情况下,我们将在第一页/视图中从用户那里获得价值,我们需要将其保留在一些变量中,直到用户到达最终页面/视图。他/她可能会经过 4-5 次观看,才能从第一次观看到达最终观看。

在 MVC 中保持价值。我们有 3 种方法。

1.全局变量 - 但是如果我在一种操作方法中赋值。该值将在另一个操作方法中重置。所以我们放弃了它。

2.Session - 但我们需要在每个会话中保留超过 5 个值。所以我们放弃了它。

3.Static Varibale - 就像魅力一样。但在多用户中会导致并发问题。

在 mvc 中还有其他方法来保持值吗?请指导我。

【问题讨论】:

  • 为什么在会话中保留超过 5 个值不好?
  • @Tommy 如果我真的不需要(我的页面除外),为什么我应该拥有超出我范围的会话价值。
  • @Tommy:我们使用会话 oly 来跨 Web 应用保存用户信息。但是对于单个控制器/页面,我们认为不要使用会话以避免将来的混乱。
  • 据我所知,要跨多个请求保留信息,您要么必须进行会话,要么在数据库中创建一个包含这些值的表(您可以在该用户进行时更新该行)。可能还有其他选项,例如写入文件,但这会很慢,而且可能不是一个很好的选择。 MVC 中没有其他结构可以让您跨多个请求保存数据。

标签: c# asp.net-mvc asp.net-mvc-4 oop static-variables


【解决方案1】:

静态变量将在应用程序域的整个生命周期中持续存在,这就是为什么您会看到多个用户的并发问题。

见:Static Variables and their implications in ASP.Net websites

在一个会话中存储五个值应该没有任何问题。您可以拥有List<T> 并将其存储在会话中。喜欢:

List<string> someValues = new List<string> {"A","B","C","D", "E",};
HttpContext.Current.Session["userValues"] = someValues;

要检索它:

var someValues =  HttpContext.Current.Session["userValues"] as List<string>;
if(someValues != null)
{
 // found
}

您唯一应该考虑的是数据的大小。会话存储在每个用户的服务器级别,存储过多数据可能会导致问题,但这取决于您的配置。

您可能还会看到:What is ViewData, ViewBag and TempData? – MVC options for passing data between current and subsequent request

【讨论】:

  • 静态变量不跨应用程序域共享。每个应用程序域都有其静态变量实例。
  • @Dirk,我并不是说它将在多个应用程序域之间共享,可能我听起来像那样,应该编辑它。
  • @Habib:非常感谢。但是还有其他选择而不是会话吗?我需要非常小心地处理会话,如果用户导航到其他页面,我需要在一个页面中清除会话。
  • 大家好,请参考此链接stackoverflow.com/questions/14154892/…
  • @Ryder:你有你的答案。这就是会话的用途。如果您有一些限制会话使用的任意要求,那么作为开发人员,您有责任通知和教导决策者,以便他们放宽要求。毕竟,你应该是这里的专家。这就是他们雇用你的原因。静态/全局变量根本不起作用。您必须为此使用会话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多