【问题标题】:how can I locate site web.config in an IIS virtual folder instead of site root如何在 IIS 虚拟文件夹而不是站点根目录中找到站点 web.config
【发布时间】:2016-07-26 23:05:16
【问题描述】:

我有一个 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 中设置为单独的网站/应用程序。只是每个实例都会指向同一个物理文件夹。

【问题讨论】:

  • 不需要放在另一个文件夹中。如果我正确理解了您当前的设置,app.config 仍然可以位于web.config 旁边的根目录中。我通常将其命名为_app.config,并在web.config 文件中包含&lt;appSettings file="_app.config"&gt;。连接字符串也一样,即_ConnectionStrings.config&lt;connectionStrings configSource="_ConnectionStrings.config" /&gt;
  • @Nkosi 正如我的帖子中所述,应用程序的每个实例都需要自己的 app.config 文件,因此 app.config 文件的位置要么需要通过 IIS 虚拟化,要么需要以某种方式根据服务器端代码中的请求 url 以编程方式更改。显然 IIS 路由无法完成,所以我希望有一种方法可以通过服务器端代码来完成。
  • 好的,我明白了。
  • App_Data 中创建一个文件夹怎么样。假设App_Data/config 在该文件夹中,您将拥有基于约定的文件。类似于 sitex.json 或 .config 或 .xml 之类的站点/应用程序,或者您在代码中为每个站点 {guid}.config 映射的某个 id ....然后您可以根据传入的请求加载文件。如果您不希望根配置中的文件,您可以为每个站点创建一个文件夹App_Data/sitex/app.config

标签: c# asp.net iis iis-8


【解决方案1】:

经过更多研究,我找到了一个可行的解决方案。确实,使用 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 文件。

我已经测试过了,它可以工作。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好的,如果使用 IIS 配置重定向的虚拟文件夹不起作用,那么我可以在服务器端 C#.NET 代码中使用一个技巧来使用物理路径实现相同的目标?例如,有没有办法做这样的事情:if(Request.Url.ToString().Contains("foo"))... get appSettings from d:\foo\app.configelse... get appSettings from d:\bar\app.config
    • 我会将此标记为正确答案,除非有人有办法通过操作 IIS 或通过服务器端代码来做到这一点。
    【解决方案3】:

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

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

    【讨论】:

    • 链接有效或谷歌“网络配置转换教程”
    • 我通读了这篇文章,虽然我认为这是一个非常有用的开发工具,但我看不出它如何解决我的问题。根据我对文章的阅读,最终结果仍然是一个 web.config 文件和多组二进制文件。我正在寻找一种解决方案,允许我通过基于 url 的 C# 代码“换入”适当的 appSettings 部分。如果这是不可能的,那么我可能不得不按照@Nkosi 的建议创建一个与 web.config 无关的自定义配置文件
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多