【问题标题】:c# static variables in different web applications inside the same application poolc#同一应用程序池内不同Web应用程序中的静态变量
【发布时间】:2014-02-18 10:49:54
【问题描述】:

如果一个 asp.net 静态变量 例如。

public static string test;

存在于共享同一个应用程序池的 2 个不同的 Web 应用程序中,是否还共享它们的静态变量的值?

如果我在站点 1 中设置测试变量:"test="1"" 我可以从站点 2 中读取此内容吗?

【问题讨论】:

  • 即使他们这样做了(而且他们没有),这听起来像是问题的错误解决方案
  • 你想要的太可怕了
  • 在 iis 中你可以设置 2 个不同的网站,例如 localhost.site1 和 localhost.site2,当你设置一个应用程序时,你可以选择应用程序池,例如 defaultapplicaitonpool,如果你使用同一个应用程序池可以你共享静态变量?
  • @MarcGravell 或正确的解决方案,如果他们想在每个应用程序域中将静态变量用作静态变量,并且担心它们会被共享。
  • @JonHanna 这很公平(当然,只需这样做就可以轻松检查;p)

标签: c# asp.net static application-pool


【解决方案1】:

不,他们没有。 Static 仅在同一 AppDomain 中的应用程序之间共享。

【讨论】:

  • 应用域是什么意思? app 域是应用程序池的代名词吗?
  • 这很奇怪,因为应用程序池共享相同的内存区域,我不知道为什么这是不可能的,所以如果我有两个具有相同静态变量的网站和一个网站更改var content 我必须在两个网站上都更改它?
  • @sparrows,是的,您必须在两者中都进行更改。否则,大多数 ASP.NET 应用程序中的大多数静态字段都会有一些其他 ASP.NET 应用程序设置的不正确数据,除非我们强制每个实例使用一个应用程序池。
  • @sparrows:关于那篇文章你想知道什么?
【解决方案2】:

每台服务器都有一个或多个应用程序池。

从应用程序池中,至少为每个 asp.net 应用程序(以及可以在 IIS 上运行的其他应用程序)启动一个进程。每个 asp.net 应用程序一个进程是常态,但如果您使用“网络花园”模式,那么可能会有多个,每个进程都是孤立的(就像一个迷你网络农场,因此是“网络花园”)。

每个这样的进程都会创建一个 AppDomain,它可以托管 ASP.NET 代码。可以在此进程上创建其他 AppDomain,尽管这对于 ASP.NET 代码通常不是必需的(例如,您可以让您的 ASP.NET 代码在沙盒 AppDomain 中以降低的权限运行一些不受信任的代码,但这并不常见场景)。

每个 AppDomain 都有所有静态字段的完全独立副本(AppDomain-Neutral 程序集有一个例外,但 ASP.NET 仅将 mscorlib 作为 AppDomain-neutral 加载)。

因此,静态字段可以安全地与 ASP.NET 一起使用,无论是在普通模式还是网络花园模式下。

【讨论】:

  • 静态变量在 web garged 中使用是不安全的,因为它们没有全局范围!!!这是我的问题,我正在寻找一种方法来保持本地缓存(如静态变量)的性能优势,但是我在网络花园花朵之间存在同步问题,我正在开发像 appfabric 这样的自定义分布式缓存。然后我在同一台服务器上拥有相同的静态变量,但在不同的应用程序中,我正在寻找一种方法来尽最大努力让它们保持同步
  • 这将使静态字段的使用比实际情况更加麻烦。尤其是库代码,编写起来要复杂得多。要在应用程序域之间进行通信,请使用 cross app-domain communication。也就是说,您越是与给定的 Web 应用程序隔离,您将拥有的可扩展性就越大,尽管并非所有应用程序都需要这种可扩展性,我会同意您。
  • 我不会将静态字段称为“安全”。我想让读者明白 1) 所有用户和所有请求都使用一个静态字段,因此您最终可以得到来自一个用户的数据被另一个用户看到,以及 2) 因为多个请求可以同时发生,所以需要锁定使用静态字段时。
  • @JohnSaunders 是的,但至少我们一次只需要推理一个应用程序。领域中立的程序集必须更加小心静态。
猜你喜欢
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多