是否在.NET上的Web应用程序中的缓存/会话中存储了静态对象/变量?

时间:2011-07-12 10:42:31

标签: c# .net session web-applications

我最近遇到了一些麻烦。

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

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

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

Response.Write(myobject.Title());

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

4 个答案:

答案 0 :(得分:4)

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

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

扩展正在发生的事情。静态变量存储在服务器的进程中,该进程由IIS控制。当你回到服务器上时,这个过程仍然存在。 IIS可以随时回收此过程。

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

答案 1 :(得分:2)

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

阅读ASP .NET State Management Recommendations以了解哪种类型的状态管理功能可用于哪种情况。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

如果有帮助,我倾向于认为你可以在一个类中声明两个独立的对象 - 动态对象定义和静态对象。通常情况下,如果你在同一个类定义中创建它们,它们之间就会有一个连接,它们串联起来(单例模式就是一个很好的例子)。

这意味着该对象是基于动态对象创建的。仍然有一个静态对象不受动态对象的创建的影响。因为这可能令人困惑,所以你不应该在不小心并理解它们之间的区别的情况下将两者结合起来。

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