草庐IT

c# - ASP.NET 静态变量的生命周期

coder 2023-07-07 原文

我在页面类(而不是 Global.asax)中定义的静态变量中保存了一些信息。我只在如下代码中声明变量:

protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;

并在 PageLoad 事件中定义变量。例如,我从数据库中检查 ID,如果它与 SomeGlobalUnsecureID 不同,我从其他地方更新 SomeGlobalUnsecureID 和 String,否则保持原样。这在我的应用程序中是绝对安全的。逻辑(即那些数据不安全,每个人都可以访问它们,没问题);我唯一想完成的是

  1. 无论连接的用户如何,都保持相同数量的内存

  2. 当且仅当持久性信息与 '内存'(因为实际读取字符串是耗时的 我。

现在,由于我在 PageLoad 中进行了检查,所以我在重新加载页面时没有问题。然而,我的页面充满了 WebMethods,有时我看到静态变量已归零。奇怪的是;即使静态变量归零, session 仍然处于事件状态(所以->没有服务器或应用程序池重启等)

这对我来说真的很奇怪。我假设静态变量将保持其值直到应用程序(以某种方式)结束。但是即使Session没有过期,静态变量也归零了。你有什么建议?使用应用程序变量是更好的选择吗?我在网上阅读的所有文档都建议使用静态变量而不是应用程序变量,我需要以某种方式声明它们吗?

最佳答案

静态变量在应用程序域的生命周期内持续存在。因此,导致您的静态变量“重置”的两件事是应用程序域重启或使用新类。对于存储在 aspx Page 类中的静态变量,当 ASP.NET 决定将 aspx Page 重新编译为新类并用新页面类替换旧页面类时,您可能会丢失静态变量。

出于这些原因,如果系统决定重新启动或替换类 (.NET doesn't kill or unload classes/assemblies in a running app domain),那么您的静态变量将重置,因为您将通过重新启动或替换获得一个新类。这适用于 aspx 页面和 classes in the App_Code folder

如果出于任何原因认为需要重新编译某个类 (see ASP.NET dynamic compilation),ASP.NET 将替换该类。

您无法防止应用程序域重启导致静态变量丢失,但您可以尝试通过类替换避免它。您可以将静态变量放在一个不是 aspx 页面且不在 App_Code 目录中的类中。您可能希望将它们放在程序中某处的 static class 上。

public static class GlobalVariables
{
    public static int SomeGlobalUnsecureID;
    public  static string SomeGlobalUnsecureString;
}

静态变量是每个池的,这意味着如果您有 2 个运行您的 asp.net 站点的池,则您有 2 个不同的静态变量。 ( Web garden mode )

如果系统以这种方式之一重新启动您的 asp.net 应用程序,静态变量将丢失。

  1. 池决定需要重新编译。
  2. 您打开 app_offline.htm 文件
  3. 您手动重启池
  4. 池已达到您定义的某些限制并重新启动。
  5. 出于任何原因,您重新启动 iis 或池。

这个静态变量不是线程安全的,如果你从不同的线程访问它们,你需要使用特殊的lock关键字。

由于无论如何重启应用程序都会重置您的静态数据,如果您真的想保留数据,则应使用自定义类将数据存储在数据库中。您可以将每个用户的信息存储在 Session State 中用database session state mode . ASP.NET 应用程序状态/变量对您没有帮助,因为 they are stored in memory, not the database ,因此它们也会在应用程序域重启时丢失。

关于c# - ASP.NET 静态变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919095/

有关c# - ASP.NET 静态变量的生命周期的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  3. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  4. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  5. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  9. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  10. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

随机推荐