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

Rob*_*ean 80 .net configuration

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

<connectionStrings configSource="D:\connectionStrings.config"/>
<appSettings configSource="D:\appSettings.config"/>
Run Code Online (Sandbox Code Playgroud)

然而,这失败了一个错误:

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

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

小智 101

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

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

  • 当然,只有在我决定分解并发表评论寻求帮助之后,我才会在之后弄明白.我注意到我的db.config被_also_复制到/ bin /文件夹,所以我更新了我的web.config以在其`configSource`中添加此路径并且一切看起来都很好.再次感谢! (16认同)
  • 你好,我喜欢这个答案,并试图将它应用到我自己的项目中,当我"发布"我的应用程序(db.config被复制到你所说的webroot)时,一切似乎工作正常,但是在通过VS调试时却没有和卡西尼.相反,我得到"无法打开configSource文件'db.config'"异常.为了能够做到这一点,有什么我想念的东西吗?谢谢! (10认同)

小智 34

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


Iai*_*man 16

看起来就是这样.configSource必须位于同一文件夹或更深层.

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


Ric*_*ard 8

您可以从任意位置加载配置,它不能通过ConfigurationManager的静态属性获得:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)
Run Code Online (Sandbox Code Playgroud)

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

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


Ser*_*exx 8

Visual Studio 2015

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

使用"添加为链接"将.config文件添加到项目中,然后将链接的"复制"属性设置为"复制如果更新"或"始终复制",则物理文件将复制到/ bin文件夹.

因此,当您在Web.Config中定义了一个配置节时,如下所示:

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />
Run Code Online (Sandbox Code Playgroud)

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

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>
Run Code Online (Sandbox Code Playgroud)

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

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


Sco*_*ott 5

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

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

<connectionStrings configSource="ConnectionStrings.config" />
Run Code Online (Sandbox Code Playgroud)

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

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  
Run Code Online (Sandbox Code Playgroud)

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

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config
Run Code Online (Sandbox Code Playgroud)

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

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

由于创建符号链接需要管理权限,因此这种方法可能不适用于所有人。如果共享文件位于同一逻辑驱动器上,则有两种相关的替代方法可能会起作用 - 硬链接和联结。有关更多信息,请参阅此讨论此讨论