【问题标题】:Sharing session between two ASP.NET applications, where one is nested within the other在两个 ASP.NET 应用程序之间共享会话,其中一个嵌套在另一个中
【发布时间】:2011-06-27 01:24:58
【问题描述】:

所以,在你问“你到底是什么意思,一个嵌套在另一个中?”之前,我会尽可能简单地解释它。

存在一个 .NET Web 应用程序 (A)。构建了一个补充应用程序 (B),它可以处理几个相同的核心组件。以前的咨询公司以某种方式在应用程序 A 中“安装”了应用程序 B,以便 B 可以搭载 A 的会话。所以,是这样的:

- Application A (C:\Inetpub\wwwroot\ApplicationA)
    + Application B (C:\Inetpub\wwwroot\ApplicationA\sup\ApplicationB

之前的公司留下了零文档,说明他们如何或为什么这样做,但它对他们有用。我现在的困境是:应用程序 A 已升级,导致 B 无用。我更新了 B 以运行 A 提供的新核心,但当我完成时,另一个团队已经淘汰了以前的生产和测试服务器,我无法获得备份以查看它是如何配置的。

经过一番折腾,我能够在单个 IIS 应用程序和池中复制上面的层次结构,方法是拆分 B 的 web.config 文件并删除重复的部分——那些已经存在于 A 的 web 中的部分.config。我还将 B 的 bin 文件夹中的所有文件转储到 A 的 bin 文件夹中。

两个站点都编译并由 IIS 提供服务,但我无法使用此结构从 A 的会话中读取任何内容。我对这个结果并不感到惊讶,但我需要找到一种解决方法。简而言之,由于 A 的创建者强加了一些疯狂的许可规则,A 在其会话中存储了一个 sessionID,我需要使用它来获取 B 中的数据源(该 sessionID 需要传递给其核心 API 中的每个函数用户授权)。

关于为什么该功能不再起作用(假设我已正确复制旧环境)的任何想法,或者我可以如何解决它?将会话状态迁移到 SQL 服务器不是一种选择——我无法更改应用程序 A 的任何内容。

我看了一点 A 的代码(尽可能多地使用 Reflector),我试图从会话中检索的变量仍然存在并正在使用中。

任何想法都会很棒!

【问题讨论】:

标签: .net asp.net session iis-6 legacy-code


【解决方案1】:

由于它们是两个独立的应用程序,它们(显然)具有两个不同的会话范围。您可以在一个会话中进行会话,但在另一个会话中没有会话,并且 A 中的会话可能会在 B 中的会话之前到期,从而迫使 A 创建一个 会话,而 B 仍在使用旧会话。没有任何东西可以将 A 与 B 联系起来,反之亦然,因此从逻辑上讲,它们甚至 可以 共享对象,因为它们之间没有有意义的关联。

简而言之 - 您不能(轻松)在两个不同的应用程序之间直接共享会话数据。这个问题的一个常见解决方案是通过查询字符串或 cookie 在两个应用程序之间传递一个公共 ID(如果它们在同一个域中),并且两者都使用该 ID 来引用它们都可以访问的数据库中的公共记录。从那时起,可以通过数据库共享信息。

【讨论】:

  • 两个“应用程序”都在与单个应用程序池绑定的单个应用程序实例下从 IIS 提供。尽管它们在两个完全不同的命名空间下运行,但它们共享一个 bin 文件夹和一个组合的 web.config 文件。没有其他虚拟目录或任何将它们分开的配置... IIS 知道不同吗?
  • 3 年后,注意到我没有回答这个评论/问题。对于那个很抱歉。在 IIS 中,许多应用程序可以共享一个应用程序池。应用程序池与底层进程模型不同 - 它可以生成子进程,或者(更常见)同一进程中可以有多个 AppDomain,对于 .NET 中的大多数实际目的,它们的行为与彼此独立的进程相同。
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2015-05-13
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多