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


82

我有两个应用程序,一个是控制台应用程序,另一个是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并从外部位置获取值吗?
我很高兴必须添加代码来做到这一点,但是我不想替换整个Configuration Manager系统。

Answers:


103

另一个解决方案是简单地将配置文件添加到所有项目中,而不是将其实际复制到项目中。然后将文件的“生成操作”设置为“内容”,将“复制到输出目录”设置为“如果较新则复制”,并且在编译项目时,文件将位于输出目录中。

要将文件添加为“添加现有项”对话框中的链接,请使用带有下拉菜单的添加按钮。从“添加”按钮的下拉菜单中选择“添加为链接”以完成该过程。


不错-比我的理解方式更容易让人理解
罗伯特·麦克莱恩

10
你好,我喜欢这个答案,并尝试将其应用到我自己的项目中,当我“发布”我的应用程序(按照您所说的将db.config复制到webroot上)时,一切似乎都可以正常工作,但是在通过VS进行调试时却没有&卡西尼号。相反,我收到“无法打开configSource文件'db.config'”异常。为了做到这一点,我缺少什么吗?谢谢!
Funka 2010年

16
当然,只有在我决定分解并发布评论以寻求帮助之后,我才可以立即解决。我注意到我的db.config也被复制到了/ bin /文件夹中,因此我更新了web.config使其在此路径之前添加了它configSource,一切似乎都很好。再次感谢!
Funka 2010年

1
@Funka-检查是否有问题,因为db.config的“ Build Action”属性设置为“ None”,而不是默认Web.config之类的“ Content”。我认为设置应为“构建操作” =“内容”和“复制到输出目录” =“不复制”。
bopapa_1979

1
在VS 2013中进行调试时,这似乎不起作用。我尝试了Erics解决方案,但这也没有用。
克里斯·内维尔

34

在appSettings下,您可以使用file =代替configSource =


1
非常适合我!谢谢!!有了这个,我可以覆盖appSettings中的
Saurabh Kumar

16

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

可以,尽管我不确定您应该使用NTFS硬链接。[疯狂的笑容]


10

Visual Studio 2015

如果您在使用Web.Config时遇到此问题,那么可以接受的答案是正确的,但仅仅是为了扩展,因为这让我给了我自己一个面相:

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

因此,当您在Web.Config中定义了这样的配置节时:

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

那么您必须像这样定义相关的config元素:

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

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

这看起来似乎很荒谬,但是如果您尚未在\ bin文件夹中没有物理文件之前进行此操作,则可能无法立即单击。


8

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

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

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

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


这需要加载整个配置文件。我只需要appSettings和connectionStrings相同,每个应用程序的文件其余部分都不同,因此无法解决问题。
罗伯特·麦克莱恩

无论如何,整个配置都是由常规(静态)属性加载的,因此这没有什么实际区别。
理查德

另外,您可以只使用自己的XML格式,并将其名称添加到应用程序的配置文件中,然后直接读取它。
理查德

5

对于连接字符串,确实可以指向共享文件。如果共享文件位于网络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>  

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

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

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

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

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


3

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


这是一个选项,但我不想(不需要)机器上其他应用程序可用的设置。令人担忧的是连接字符串,它们具有非常通用的名称,可能会与其他应用程序冲突。
罗伯特·麦克莱恩

2

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


2

我在这个问题上苦苦挣扎,但是我在这里找到了一个很好的解决方案:使用外部配置运行测试

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

虽然为什么单元测试类型项目可以从其自己的app.config中获取配置设置,但是却无法像普通app.config一样加载引用的配置文件,这让我感到困惑。我将其称为错误,因为您希望测试项目app.config的行为与应用程序的app.config的行为相同,但事实并非如此。


1

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

有一个很好的文章在这里就可以了

这样您可以指定相对路径,如下所示

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

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

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

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.