【问题标题】:Is a static object/variable stored on cache/session in a web application on .NET?静态对象/变量是否存储在 .NET 上的 Web 应用程序的缓存/会话中?
【发布时间】:2011-07-12 10:42:30
【问题描述】:

我最近遇到了一些麻烦。

在 WebForm 上,我声明了一个静态对象,如下所示:

public static MyObject myobject=new MyObject();
Response.Write(myobject.Title());

现在,如果我加载另一个不包含 myobject 声明的页面,我会再次这样做

Response.Write(myobject.Title());

我看到了之前的结果。由于静态,对象是否在导航期间存储在会话中?它是由 VIEWSTATE 估计的?或者发生了什么?

【问题讨论】:

  • 它存储在您的应用程序中:服务器端,所有用户。
  • @markzzz 因为它在 all 用户的 all 请求之间共享。这在 Web 应用程序中很少是您想要的。

标签: c# .net session web-applications


【解决方案1】:

不,它在进程中存储为静态变量,可以在任何时候回收,假设您使用 IIS。

简而言之,这种情况下尽量不要使用静态变量。

扩展正在发生的事情。静态变量存储在由 IIS 控制的服务器进程中。碰巧的是,当您回调服务器时,该进程仍然处于活动状态。 IIS 可以随时回收这个进程。

更新: 更准确地说,它是每个 AppDomain,它位于一个进程中 - 在我之前的段落中用 AppDomain 替换单词 process :-)

【讨论】:

    【解决方案2】:

    这只是一个静态变量。它与类型一起“存在” - 因此它将由通过同一 AppDomain 中的同一类型访问同一字段的所有代码共享。它将在AppDomain 回收时丢失,并且不会在多个服务器之间共享等。

    除了偶尔用于本地缓存之外,在 webapps 中使用 static 变量基本上不是一个好主意...

    【讨论】:

    • 嗯...但理论上每个“用户”都有一个相同对象的实例;我的意思是请求页面和实例 MyObject 的用户将访问它并且只有它,而不是另一个用户的另一个实例。那么会有什么问题呢?
    • 静态变量不属于实例,它们属于类型。因此,用户获得了一个页面的实例,但服务器拥有该类型。每个实例都将获取类型的静态变量(如果有)。当 AppDomain 回收时,静态变量被重置。
    • 那么,如果 UserA 持有静态对象并将其保存(例如)数据 Marco,另一个用户(例如 UserB)可以读取 Marco?
    • @markzzz:UserA 不会“持有”一个静态对象。没有像“静态对象”这样的事物。只有静态字段,它们与类型相关联,而不是与该类型的任何实例相关联。这实际上与 ASP.NET 无关——它是核心 C#。
    【解决方案3】:

    静态对象在用户之间共享。它不存储在用户唯一的会话或每个页面唯一的视图状态中。

    阅读ASP .NET State Management Recommendations,了解在哪种情况下使用哪种类型的状态管理功能。

    【讨论】:

      【解决方案4】:

      如果有帮助,我倾向于认为您可以在一个类中声明两个单独的对象——动态对象定义和静态对象。通常,如果您在同一个类定义中创建它们,它们之间就会有联系,并且它们协同工作(单例模式就是一个很好的例子)。

      意思是对象是基于动态对象创建的。仍然有一个不受动态对象创建影响的静态对象。因为这可能会造成混淆,所以您不应该在不仔细并了解它们之间的区别的情况下将两者结合起来。

      我意识到这并不是对正在发生的事情的真正理解,但它有助于我在脑海中保持这种区别。每种类型都有自己的用途,应该适当地使用(我见过应该是静态的动态类,反之亦然)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        相关资源
        最近更新 更多