如何在IIS虚拟文件夹中而不是在站点根目录中定位站点web.config

本文关键字:站点 根目录 web config 定位 IIS 虚拟 文件夹 | 更新日期: 2023-09-27 17:58:40

我有一个ASP.NET web应用程序的多个实例,除了web.config文件之外,这些实例在各个方面都是相同的,web.config文件包含特定于实例的设置。为了避免同一组文件有多个副本,我希望将web.config文件的全部或部分放在IIS虚拟文件夹中。

我在站点根文件夹下创建了一个IIS虚拟文件夹"config",并使用web.config文件中的以下行引用它:

<appSettings configSource="config''app.config" />

不幸的是,IIS在名为"config"的站点根文件夹下寻找一个物理路径,当找不到时会出现错误。

有人知道诱骗IIS使用IIS虚拟文件夹的方法吗?我也愿意就如何实现同一目标(使用同一文件夹为同一网站的多个实例提供服务,仅appSettings不同)提出任何建议(包括服务器端代码)。

我还考虑过将所有内容转储到一个虚拟的"web"文件夹中,但这需要将所有引用重新建立在近200个文件中。在这里,使用标记不是一个可行的解决方案,因为它重新建立了包括相同页面引用在内的所有内容的基础,但莫名其妙地不适用于对.less文件的引用。

编辑:虽然想法是对多个实例使用相同的文件夹,但我想明确的是,每个实例都将在IIS中设置为一个单独的网站/应用程序。只是每个实例都指向同一个物理文件夹

如何在IIS虚拟文件夹中而不是在站点根目录中定位站点web.config

经过更多的研究,我找到了一个可行的解决方案。确实,使用configSource对虚拟文件夹中的另一个配置文件进行直接引用是不可能的,因为web.config文件中的文件夹引用应该是物理引用。但是,IIS虚拟目录每个都可以有自己的web.config文件。我的解决方案是:

1) 在IIS中的站点下创建一个虚拟文件夹。把它指向你想要的任何物理路径。

2) 将web.config文件添加到该文件夹中,该文件包含特定于该站点实例的内容。从我最初文章中的例子来看,那将是appSettings部分。

3) 在服务器端代码中,使用System.Xml.XPath方法使用System.Web.HttpContext.Current.Server.MapPath("config/web.config")返回的路径遍历web.config文件。MapPath将IIS虚拟文件夹的相对引用转换为服务器上可用的物理引用。

在虚拟文件夹中使用web.config的另一个好处是,它对客户端浏览器是不可见的,就像站点web.config一样。

使用上述方法,可以从一个源物理位置使用相同的二进制文件和客户端可见文件,为同一站点的多个IIS实例提供服务,这些实例的不同之处仅在于存储在"config"IIS虚拟文件夹中的web.config文件的内容。显然,IIS中应用程序的每个实例都会使用自己的web.config文件将其配置虚拟文件夹指向不同的物理位置。

我已经测试过了,它是有效的。

不,不能。虚拟目录是IIS的概念,但您使用的配置文件重定向(单独的配置文件)是.NET/AASP.NET的概念。因此,当发现单独的配置文件时,只搜索物理目录,因为搜索算法不知道什么是虚拟目录以及如何在IIS配置中找到它们。

为什么不能尝试对多个环境进行Web配置转换。我已经给出了启动的示例链接

http://deanhume.com/home/blogpost/working-with-multiple-web-config-files/4100