【问题标题】:Two ASP.NET sites sharing application files but with different web.config两个 ASP.NET 站点共享应用程序文件但具有不同的 web.config
【发布时间】:2010-11-03 08:00:01
【问题描述】:

是否可以使用虚拟目录和/或虚拟应用程序来设置两个共享相同应用程序代码(aspx 页面等)但具有不同 web.config 文件的网站?站点和代码驻留在同一个 IIS 上运行的同一台服务器上。

我正在使用 IIS 6。

【问题讨论】:

  • 这两个.config文件有什么区别?也许只是与身份验证和授权有关?通常可以找到其他方法来处理此类问题(例如,在 Internet 站点和管理它的 Intranet 站点之间共享)。
  • 唯一的区别是一些appSettings。我只是想知道我是否可以在不更改任何代码的情况下做到这一点。
  • @Jakob- 您可以通过在应用程序设置中添加某种特定于应用程序的键前缀来完成此操作,但这仍然需要更改代码。
  • @Jakob:好的,现在 IIS 站点或虚拟目录之间有什么区别?一组用户使用一个 VD,另一组用户使用另一个 VD?这些集合是否不相交(没有共同的成员)?如果是这样,那么我会更改代码(对不起),以便不同的 appSettings 由登录用户的某些属性驱动。也许使用的主机头;可能是用户所在的角色。.config 文件是相同的,但您会从数据库或其他配置文件中获得这些不同的设置。

标签: asp.net iis-6 web-config


【解决方案1】:

如果您想将代码保存在一个地方,简短的回答是否定的。可能最好的解决方案是让应用程序根据您确定的站点(可能是主机标头?)加载自定义配置文件。

ConfigurationManager.OpenExeConfiguration 之类的东西可能有用。

我想另一种方法是提出一个配置约定,将所有内容都放在一个文件中,然后使用GetSection(带有某种特定于应用程序的前缀)来获取所需的特定设置。

【讨论】:

  • 是的,我知道这可以通过其他方式完成。我只是希望我可以在不更改现有代码的情况下做到这一点。
  • 简短的回答是“是”,虽然不使用虚拟目录,但使用 NTFS 硬链接:stackoverflow.com/questions/45889661/…
【解决方案2】:

我很确定我在几年前做过一次,以便为网站的每个实例使用不同的数据库连接字符串。我的猜测是网站的每个实例都有一个虚拟目录,only 包含一个带有实例特定设置的 web.config,然后在每个虚拟目录中都有一个引用源代码的应用程序(其中包括一个共享的 web.config)。

因此,如果我没记错的话,诀窍是,对于给定的网站,拥有一个仅包含 web.config 的虚拟目录。 this 中的值将由该虚拟目录的子应用继承。

【讨论】:

  • 酷。您是否注意到哪个 web.config 优先?内部还是外部?我似乎记得它是外部的。
【解决方案3】:

这根本不可能。

为什么???

因为 asp.net 工作进程将从应用程序物理所在的物理文件夹中读取默认配置文件。虚拟目录与 web.config 无关。它只是被 webserver(IIS) 用来映射到作为网站根目录的特定物理目录。

谢谢。

【讨论】:

  • -1 表示“虚拟目录与 web.config 无关。”见这里... msdn.microsoft.com/en-us/library/…, '当服务器接收到对特定 Web 资源的请求时,ASP.NET 使用位于所请求 URL 的虚拟目录路径中的所有配置文件分层计算该资源的配置设置。 '
【解决方案4】:

应该是,将使用虚拟应用程序中的web.config。如果布局是分层的,您可能需要注意 web.config 继承

【讨论】:

  • 我应该补充一点,您需要应用程序代码的 2 个物理副本,因为每个副本都需要一个 web.config
【解决方案5】:

我假设您有应用程序 A、应用程序 B、应用程序 C 等等,它们都完全相同,只是它们的 web.config 文件中定义的一些配置属性不同。

当然这是可能的 - 最简单的方法是将项目设置为 Web 应用程序,然后编译,然后在应用程序之间共享该 dll。您可以根据需要使用 GAC。

您可以在 IIS 中设置指向所有逻辑所在的共享目录(或在每个站点中使用虚拟目录)的各个站点,但您不能共享 app_code 文件夹。

编辑

RichardOD 在上面给出了最好的答案,我之前也实现过类似的东西。基本上,我设置了一个由 web.config 引用的自定义配置文件(以防止在我对其进行更改时重新启动应用程序)。此文件按主机名读取,并包含基于每个主机的特定属性。

我所做的只是将主机头添加到 IIS,并在自定义配置文件中为该主机添加一个条目。完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2012-09-28
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2016-10-15
    • 2014-02-12
    相关资源
    最近更新 更多