.NET中的共享配置文件

8
我有一个解决方案,包括一个Web应用程序和一个Windows NT服务应用程序。当然,这是两个不同的项目,但在同一个解决方案中。它们共享很多相同的配置。
目前,我在web.config和app.config文件中都有相同的值。这开始变得混乱了,我想为解决方案中的两个应用程序使用共享的配置文件。
以下是需要翻译的问题:
  • 如果配置文件不在Web应用程序的根级别,这对Web应用程序是否有问题?这里有限制吗?
  • 如果不使用web.config,会失去Web应用程序的缓存和自动回收吗?
  • 按照上述描述共享配置通常是个坏主意吗?
2个回答

9

你可以将配置文件中的某些部分“外部化”到单独的.config文件中,并从两个位置使用它们。

例如,你可以将连接字符串设置外部化如下:

<connectionStrings configSource="connectionStrings.config" />

然后将"connectionString.config"文件设置为如下内容:

<?xml version="1.0" encoding="utf-8"?>
<connectionStrings>
  <add name="ConfigurationDatabase" 
       connectionString="server=.;Integrated Security=true;database=test"/>
  <add name="TestDatabase" 
       connectionString="server=TEST;Integrated Security=true;database=test"/>
</connectionStrings>

基本上,任何 ConfigurationSection 都有 "configSource" 设置,它允许您指定要使用的外部文件。

这样,您可以共享两个配置文件的公共部分。

Marc


1
configSource属性不允许在其中放置“..”或“~/”,并声明“它必须引用与配置文件相同目录或子目录中的文件。” 鉴于此,如果两个项目都无法达到比自身更高的目录级别,那么它们如何共享外部文件呢? - James in Indy
@James in Indy:你可以利用NTFS文件系统级别的功能,如硬链接和软链接,使文件出现在目录中,即使它实际上并不存在...(它只是指向实际文件的链接/指针)。在Google上搜索“NTFS硬链接”或“NTFS连接点”。 - marc_s

2
您仍需要一个 web.config,因为配置中有一些是特定于 Web 的元素,这些元素不会在服务的 app.config 中。正如 Marc 所说 的,使用 ConfigSource 属性将使您能够共享常见元素。
请注意,appSettings 元素有一个细微的区别:File 属性。

指定到包含自定义应用程序配置设置的外部文件的相对路径。指定的文件包含与 appSettings 添加、清除和删除属性指定的设置相同类型的设置,并使用与这些元素相同的键/值对格式。

这与 ConfigSource 属性的行为不同,因为您不必使用外部文件替换整个部分,它可以只包含您想要的元素以及覆盖值:

您可以使用 file 属性指定配置文件,该文件提供附加设置或覆盖 appSettings 元素中指定的设置。

如果您正在使用ConfigSource共享其他元素,则在更改值时仍会自动重启应用程序-关于restartOnExternalChanges属性的说明应该被忽略,但是使用File属性将意味着更改不会导致重启ASP.NET应用程序。
外部文件的内容仍应该被缓存,因此性能不应受影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接