如何在 IIS 虚拟文件夹而不是站点根目录中找到站点 web.config
how can I locate site web.config in an IIS virtual folder instead of site root
我有一个 ASP.NET Web 应用程序的多个实例,除了 web.config 文件(包含特定于实例的设置)外,它们在各个方面都是相同的。为了避免同一组文件的多个副本,我想将 web.config 文件的全部或部分放在 IIS 虚拟文件夹中。
我在站点根文件夹下创建了一个 IIS 虚拟文件夹 "config",并在 web.config 文件中使用以下行来引用它:
<appSettings configSource="config\app.config" />
不幸的是,IIS 在名为 "config" 的站点根文件夹下寻找物理路径,并在找不到时报错。
有谁知道诱使 IIS 使用 IIS 虚拟文件夹的方法吗?我也打开任何关于如何实现相同目标的建议(包括服务器端代码)(使用相同的文件夹来服务相同网站的多个实例,仅 appSettings 不同)。
我还考虑过将所有内容转储到一个虚拟 "web" 文件夹中,但这需要将近 200 个文件中的所有引用重新定位。在这里使用标签不是一个可行的解决方案,因为它会重新定位包括相同页面引用在内的所有内容,但对于对 .less 文件的引用莫名其妙地不起作用。
编辑:虽然我的想法是为多个实例使用同一个文件夹,但我想明确指出,每个实例都将在 IIS 中设置为单独的 Web site/application。只是每个实例都会指向同一个物理文件夹。
不,你不能。虚拟目录是一个 IIS 概念,但您使用的配置文件重定向(单独的配置文件)是一个 .NET/ASP.NET 概念。因此,当发现单独的配置文件时,只搜索物理目录,因为搜索算法不知道什么是虚拟目录以及如何在 IIS 配置中找到它们。
为什么不能尝试对多个环境进行 Web 配置转换。我已经给了样品 link 启动
http://deanhume.com/home/blogpost/working-with-multiple-web-config-files/4100
经过更多研究,我找到了一个可行的解决方案。的确,使用 configSource 对虚拟文件夹中的另一个配置文件的 直接 引用是不可能的,因为 web.config 文件中的文件夹引用应该是物理引用。但是,每个 IIS 虚拟目录都可以有自己的 web.config 文件。我的解决方案是:
1) 在您的 IIS 站点下创建一个虚拟文件夹。将其指向您想要的任何物理路径。
2) 将 web.config 文件添加到该文件夹,其中包含特定于您网站实例的内容。从我原来 post 中的示例来看,那将是 appSettings 部分。
3) 在您的服务器端代码中,使用 System.Xml.XPath
方法使用 System.Web.HttpContext.Current.Server.MapPath("config/web.config")
返回的路径遍历 web.config 文件。 MapPath 将 IIS 虚拟文件夹相对引用转换为服务器上可用的物理引用。
在虚拟文件夹中使用 web.config 的另一个好处是它对客户端浏览器不可见,就像站点 web.config 一样。
使用上述方法,可以从一个源物理位置使用相同的二进制文件和客户端可查看文件来为同一站点的多个 IIS 实例提供服务,区别仅在于 web.config 文件中存储的内容"config" IIS 虚拟文件夹。显然,IIS 中的每个应用程序实例都会将其配置虚拟文件夹指向具有自己的 web.config 文件的不同物理位置。
我已经测试过了并且有效。
我有一个 ASP.NET Web 应用程序的多个实例,除了 web.config 文件(包含特定于实例的设置)外,它们在各个方面都是相同的。为了避免同一组文件的多个副本,我想将 web.config 文件的全部或部分放在 IIS 虚拟文件夹中。
我在站点根文件夹下创建了一个 IIS 虚拟文件夹 "config",并在 web.config 文件中使用以下行来引用它:
<appSettings configSource="config\app.config" />
不幸的是,IIS 在名为 "config" 的站点根文件夹下寻找物理路径,并在找不到时报错。
有谁知道诱使 IIS 使用 IIS 虚拟文件夹的方法吗?我也打开任何关于如何实现相同目标的建议(包括服务器端代码)(使用相同的文件夹来服务相同网站的多个实例,仅 appSettings 不同)。
我还考虑过将所有内容转储到一个虚拟 "web" 文件夹中,但这需要将近 200 个文件中的所有引用重新定位。在这里使用标签不是一个可行的解决方案,因为它会重新定位包括相同页面引用在内的所有内容,但对于对 .less 文件的引用莫名其妙地不起作用。
编辑:虽然我的想法是为多个实例使用同一个文件夹,但我想明确指出,每个实例都将在 IIS 中设置为单独的 Web site/application。只是每个实例都会指向同一个物理文件夹。
不,你不能。虚拟目录是一个 IIS 概念,但您使用的配置文件重定向(单独的配置文件)是一个 .NET/ASP.NET 概念。因此,当发现单独的配置文件时,只搜索物理目录,因为搜索算法不知道什么是虚拟目录以及如何在 IIS 配置中找到它们。
为什么不能尝试对多个环境进行 Web 配置转换。我已经给了样品 link 启动
http://deanhume.com/home/blogpost/working-with-multiple-web-config-files/4100
经过更多研究,我找到了一个可行的解决方案。的确,使用 configSource 对虚拟文件夹中的另一个配置文件的 直接 引用是不可能的,因为 web.config 文件中的文件夹引用应该是物理引用。但是,每个 IIS 虚拟目录都可以有自己的 web.config 文件。我的解决方案是:
1) 在您的 IIS 站点下创建一个虚拟文件夹。将其指向您想要的任何物理路径。
2) 将 web.config 文件添加到该文件夹,其中包含特定于您网站实例的内容。从我原来 post 中的示例来看,那将是 appSettings 部分。
3) 在您的服务器端代码中,使用 System.Xml.XPath
方法使用 System.Web.HttpContext.Current.Server.MapPath("config/web.config")
返回的路径遍历 web.config 文件。 MapPath 将 IIS 虚拟文件夹相对引用转换为服务器上可用的物理引用。
在虚拟文件夹中使用 web.config 的另一个好处是它对客户端浏览器不可见,就像站点 web.config 一样。
使用上述方法,可以从一个源物理位置使用相同的二进制文件和客户端可查看文件来为同一站点的多个 IIS 实例提供服务,区别仅在于 web.config 文件中存储的内容"config" IIS 虚拟文件夹。显然,IIS 中的每个应用程序实例都会将其配置虚拟文件夹指向具有自己的 web.config 文件的不同物理位置。
我已经测试过了并且有效。