是一个静态对象/变量,存储在.net web应用程序的缓存/会话中

本文关键字:web net 应用程序 会话 缓存 存储 变量 一个 对象 静态 | 更新日期: 2023-09-27 18:01:54

我最近遇到了一些麻烦。

在WebForm中,我声明了一个静态对象,像这样:
public static MyObject myobject=new MyObject();
Response.Write(myobject.Title());

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

Response.Write(myobject.Title());

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

是一个静态对象/变量,存储在.net web应用程序的缓存/会话中

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

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

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

Update: OK,更准确地说,它是每个AppDomain,它位于一个进程中-在我前面的段落中用AppDomain代替process这个词:-)

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

基本上它不是一个好主意,使用static变量在webapps除了偶尔的本地缓存…

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

请阅读asp.net状态管理建议,以了解在哪种情况下使用哪种类型的状态管理特性。

如果有帮助的话,我倾向于认为可以在一个类中声明两个独立的对象——动态对象定义和静态对象。通常,如果您在相同的类定义中创建它们,则它们之间存在连接,并且它们协同工作(单例模式是一个典型的例子)。

它的意思是对象是基于动态对象创建的。仍然有一个静态对象不受动态对象创建的影响。因为这可能会造成混淆,所以在没有仔细理解它们之间的区别之前,不应该将它们组合在一起。

我意识到这并不是对正在发生的事情的真正理解,但它帮助我记住了其中的区别。每种类型都有自己的用途,应该适当地使用(我见过应该是静态的动态类,以及相反的情况)。