【问题标题】:Are static variables shared between same app accessed by different host names?不同主机名访问的同一应用程序之间是否共享静态变量?
【发布时间】:2018-10-23 16:36:28
【问题描述】:

我已经相当肯定答案是否定的,但似乎找不到明确的答案。如果我部署一个可以被多个主机名访问的应用程序,每个主机名都会启动它自己独立的应用程序实例,并且它们之间不会共享静态变量,对吧?

编辑:托管环境是 IIS,只有一个网站有多个绑定到不同的主机名。

【问题讨论】:

  • @Igor 意思是,我假设每个主机名都会有自己的应用程序域,即使它在同一个网站上。谢谢。
  • @Igor 我认为将其标记为重复是完全可以的,因为问题已得到回答,并且引用的链接提供了额外的有用信息。但原则上我觉得有必要指出,问题不在于每个 AppDomain 是否有自己的空间,而在于将多个主机名绑定到同一个网站是否会导致多个 AppDomain 或使用同一个.
  • 我误读了您的实际问题。你能用托管平台edit它吗?如何配置?这将决定您是否每个主机都有一个 appdomain。
  • @Igor 完成。 (等等等等来凑够足够的字符来发帖)
  • 它们是否被共享几乎是无关紧要的。尝试在 asp.net 站点中使用静态变量通常只是通往失败之路的第一步。应用程序池、回收等意味着您无法保证任何两个请求都将由同一个应用程序实例提供服务。

标签: c# asp.net iis-8


【解决方案1】:

IIS 允许您设置网站实际可以运行的实例数。如果 IIS 配置为仅运行单个实例并且多个域指向该单个实例,您将能够访问您的变量。由于资源管理,IIS 会在需要时经常重启这些实例。这就是为什么如果一个请求进来,发现 IIS 已经重启了实例,它就会丢失之前的静态变量值的内容。但是,如果找到相同的实例,静态变量仍将保持其值。

不建议使用静态变量来处理交叉请求消息,因为大多数托管服务提供商不使用单个实例来运行您的网站,但可能会使用网络农场来这样做。这进一步使我们了解为什么在处理会话时使用进程内会话不好。 [因为一旦实例重新启动,会话值将丢失]。

在网络场中,许多实例开始处理多个传入请求。因此,一个请求可能由与处理前一个请求的实例不同的另一个实例处理。处理请求的新实例肯定没有另一个实例的变量值。即使它们是同一网站的副本。这是因为它们被识别为同时在服务器上运行的两个不同的应用程序,并且操作系统不允许在两个不同的应用程序之间直接共享静态变量。

但是,您可以充分利用 IIS 中的服务器端应用程序设置,或使用 cookie 跨多个域路由信息。例如,这些将使您能够从单个网站处理系统中所有其他网站的单次登录。当认证网站设置了其他网站可以访问的 cookie 时,您可以实现此目的。 ASP.NET 允许您这样做。

谢谢

【讨论】:

  • 谢谢。我对一件事有点不清楚。您听起来好像“可以”通过共享相同 AppDomain 的两个不同主机名访问该站点。我认为这可能是不正确的(正如 Igor 在他的 cmets 中指出的那样),或者我可能误解了你。
  • 基本上我只是根据用于访问该站点的主机名查找客户信息(即,如果访问了 client1.oursite.com,那么它将包含有关 client1 的数据,或者如果 client2.oursite .com 被访问,然后它将包含有关 client2) 的数据。如果应用程序池重置或类似的事情,它只会重新加载数据......没什么大不了的。它只是读过的;没有写,所以我不在乎用户是否在请求之间点击了不同的实例。唯一不可能发生的事情是每次启动新的客户端门户实例时都会更新变量,并且在所有门户之间共享。
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多