.NET Config文件应用程序目录文件夹外的configSource

时间:2009-02-20 10:54:38

标签: .net configuration

我有两个应用程序,一个是控制台应用程序,另一个是ASP.NET应用程序。他们都需要知道相同的appSettings和connectionStrings。理想情况下,我想使用app.config / web.config文件的configSource属性将其指向一个中心位置。例如

<connectionStrings configSource="D:\connectionStrings.config"/>
<appSettings configSource="D:\appSettings.config"/>

然而失败并出现错误:

  

configSource属性无效:configSource'D:\ appSettings.config'无效。它必须引用与配置文件相同的目录或子目录中的文件。

无论如何仍然使用配置管理器appSettings / connectionStrings并从外部位置获取值?
我很高兴不得不添加代码来完成它,但我不想替换整个配置管理器系统。

10 个答案:

答案 0 :(得分:97)

另一个解决方案是将所有项目中的配置文件添加为链接,而不是将文件实际复制到项目中。然后将文件的“Build Action”设置为“Content”,将“Copy to Output Directory”设置为“Copy if newer”,编译项目时,您将把文件放在输出目录中。

要在“添加现有项目”对话框中将文件添加为链接,可以使用带有下拉列表的“添加”按钮。从“添加”按钮的下拉列表中选择“添加为链接”以完成此过程。

答案 1 :(得分:33)

在appSettings下,您可以使用file =而不是configSource =

答案 2 :(得分:16)

似乎就是这样。 configSource必须位于同一个文件夹或更深层。

可以,虽然我不确定你应该,但是使用NTFS硬链接。 [疯狂的笑]

答案 3 :(得分:8)

您可以从任意位置加载配置,它将无法通过ConfigurationManager的静态属性提供:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(存在一个允许指定多个文件的重载,以支持默认/用户漫游/用户本地层次结构。)

丢失静态属性意味着所有代码都需要了解不同的配置。

答案 4 :(得分:7)

Visual Studio 2015

如果你在Web.Config上遇到这个问题,那么接受的答案是正确的,但只是为了扩展,因为这让我给自己的脸掌:

使用“添加为链接”将.config文件添加到项目中,然后将链接的Copy属性设置为“Copy If Newer”或“Copy Always”,然后将物理文件复制到/ bin文件夹。

因此,当你在Web.Config中定义了一个配置部分时:

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />

然后你必须像这样定义相关的配置元素:

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>

这样configSource指向物理bin \ MySpecialConfig.config文件而不是链接另外,请注意该路径是相对物理路径。

这可能看起来非常明显但是如果你还没有在物理文件还没有在\ bin文件夹中之前这样做,那么它可能不会马上点击​​。

答案 5 :(得分:4)

在连接字符串的情况下,确实可以指向共享文件。如果共享文件位于网络UNC上,则它需要托管应用程序的计算机上的管理权限。

解决方案:在您的web.config中,使用configSource指向本地配置文件。由于.Net限制,它必须等于或低于根配置文件的级别。我只是指向app文件夹中的一个文件:

<connectionStrings configSource="ConnectionStrings.config" />

在应用程序池用户可访问的共享位置中,添加包含共享连接字符串的配置文件。此文件不得包含除connectionStrings部分本身之外的任何xml。共享文件ConnectionStrings.config如下所示:

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  

现在的伎俩。在app文件夹中创建一个指向外部共享配置文件的Windows符号链接。您需要管理员权限才能执行此操作:

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config

我们刚刚超越.Net。 Configuration系统将使用configSource设置在名为ConnectionStrings.config的本地文件中查找连接字符串。符号链接看起来像.Net的文件,符号链接解析为共享配置文件。

警告:对共享文件的更改不会自动触发.Net中的应用重启。对于IIS,需要手动重新启动网站或应用程序池。

由于需要管理权限来创建符号链接,这种方法可能对每个人都不起作用。如果共享文件位于同一逻辑驱动器上,则可以使用两个相关的替代方案 - 硬链接和联结。有关详细信息,请参阅this discussionthis discussion

答案 6 :(得分:3)

您可以将这两个设置放在machine.config中,然后它们就可用于服务器上的所有应用程序。

答案 7 :(得分:2)

我发现最好的解决方案是将“共享”配置文件放在中央文件中,然后在Visual Studio中使用预构建事件将它们复制到需要它的每个项目的相对文件夹中。

答案 8 :(得分:2)

我在这个问题上遇到了很多困难,但我在这里找到了一个很好的解决方案:test run with external config

(您可以通过编辑.testrunco​​nfig文件来指示测试运行将文件和目录复制到测试运行目录中。)

虽然为什么单元测试类型项目可以从自己的app.config获取配置设置,但是无法像普通的app.config那样加载引用的配置文件对我来说有点令人困惑。我称之为一个错误,因为您希望测试项目app.config的行为与应用程序的app.config行为相同,但事实并非如此。

答案 9 :(得分:1)

您可以使用file属性而不是configSource

上面有一篇不错的文章here

这使您可以像这样指定相对路径

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings file="..\..\..\..\..\..\ExternalFile.config"></appSettings>
</configuration>

该路径是相对于输出目录的。

然后在ExternalFile.config中,只需添加appSettings部分

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>