.NETconfiguration文件configSource在应用程序目录文件夹之外

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

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

但是,这个错误会失败:

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

是否仍然使用configurationpipe理器appSettings / connectionStrings并从外部位置获取值?
我很高兴不得不添加代码来做到这一点,但我不想更换整个configurationpipe理器系统。

另一个解决scheme是简单地将configuration文件作为链接添加到所有项目中,而不是将文件实际上复制到项目中。 然后将文件的“生成操作”设置为“内容”和“复制到输出目录”为“复制,如果更新”,当您编译项目时,您将在输出目录中具有该文件。

要将文件添加为链接,请在“添加现有项目”对话框中select“添加为链接”。

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

这似乎就是这样。 configSource必须位于相同的文件夹中或更深。

可以 ,但我不知道你应该使用NTFS硬链接。 [疯狂的笑容]

您可以从任意位置加载configuration, 无法通过ConfigurationManager的静态属性进行configuration:

 Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path) 

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

失去静态属性意味着所有的代码需要知道不同的configuration。

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

我发现最好的解决scheme是将“共享”configuration文件放在一个中央文件中,然后在Visual Studio中使用预生成事件将它们复制到每个需要它的项目的相关文件夹中。

我在这个问题上有一个很大的困难,但是我在这里find了一个很好的解决scheme: 用外部configurationtesting运行

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

虽然为什么unit testingtypes的项目可以从它自己的app.config中获取configuration设置,但是不能像正常的app.config那样加载引用的configuration文件,这对我来说有些莫名其妙。 我会把它称为一个错误,因为你会期望一个testing项目的app.config行为应用程序的app.config行为的相同方式,但事实并非如此。

在连接string的情况下,确实可以指向共享文件。 如果共享文件位于networkingUNC上,则需要托pipe应用程序的计算机上的pipe理权限。

解决scheme:在你的web.config中,使用configSource指向一个本地configuration文件。 由于.Net的限制,它必须处于或低于根configuration文件的级别。 我只是指向应用程序文件夹本身的文件:

 <connectionStrings configSource="ConnectionStrings.config" /> 

在应用程序池用户可访问的共享位置,添加包含共享连接string的configuration文件。 这个文件不能包含除connectionStrings部分之外的任何xml。 共享文件ConnectionStrings.config如下所示:

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

现在的窍门。 在您的应用程序文件夹中创build一个指向外部共享configuration文件的Windows符号链接。 您将需要pipe理员权限才能执行此操作:

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

我们刚刚胜过.Net。 Configuration系统将使用configSource设置在名为ConnectionStrings.config的本地文件中查找连接string。 符号链接看起来像.Net文件,符号链接parsing为共享configuration文件。

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

由于需要pipe理权限来创build符号链接,这种方法可能不适用于所有人。 如果共享文件位于相同的逻辑驱动器上,则有两种相关的替代scheme可用 – 硬链接和联结。 看到这个讨论和这个讨论了解更多信息。

Visual Studio 2015

如果你在使用Web.Config时遇到这个问题,那么接受的答案是正确的,但是只是为了扩展,因为这让我有了自己的一面:

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

因此,当你有一个在Web.Config中定义的configuration部分是这样的:

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

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

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

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

这可能看起来很明显,但是如果在物理文件还没有放在\ bin文件夹之前没有这样做,所以它可能不会马上点击​​。