我有一台装有 IIS 的 Windows 2008R2 服务器,运行一个站点(ASP.NET4.5)。所有参数都写在 web.config 文件中。
我必须添加一个新站点,它将在与第一个站点相同的代码(相同的根文件夹)上运行,但将从它自己的配置文件中读取诸如 sql 连接字符串等参数,而不是从第一个站点 web.config 中读取。
我怎样才能做到这一点?
是否可以在不同的应用程序池中运行第二个站点?当然,两个站点都将运行相同的 .NET 版本。
谢谢你!
答案1
是的。多年来,我一直从多个 AppPool 提供完全相同的代码/文件;它运行良好。
但是所有实例都会以相同的方式读取 web.config,因为 Microsoft 的标准功能并非为执行您要执行的操作而编写的。因此,您必须实现自己的自定义解决方案来确定代码在哪个实例下运行,并根据该实例选择适当的配置变量。您可以将配置数据存储在 web.config 中的自定义配置部分中(在“configSections”中定义),也可以在其他地方使用单独的 .config 文件。
我通常会根据运行 IIS 应用程序的路径(即路径)切换代码的行为。例如,如果网站在“/example1”下提供服务,我会选择一组配置数据,如果网站在“/example2”下提供服务,我会选择另一组配置数据。(请注意,当您通过 VisualStudio 运行网站时,您还需要处理 Dev Server 的 URL 的配置。)
答案2
另一个解决方案是维护两个单独的根文件夹,每个文件夹都有自己的 web.config,但创建指向另一个根文件夹中的目录/文件的链接,因此您只需在一个位置维护源。
Powershell 第一次创建链接时的操作如下:
function mklink { cmd /c mklink $args }
Get-ChildItem "root-source" | Where {($_.PSIsContainer) -band ($_.Name -ne "web.config")} | mklink /d ("root-links-are-here" + $_.Name) $_.FullName
Get-ChildItem "root-source" | Where {(!$_.PSIsContainer) -band ($_.Name -ne "web.config")} | mklink ("root-links-are-here" + $_.Name) $_.FullName