在我的生产环境中,我在同一台机器上安装了多个Web应用程序。这些应用程序访问各种Web服务和两个SQL Server数据库,这意味着我的web.config文件非常庞大且充满了详细信息。除此之外,我还有Windows服务,使用相同的Web服务并访问不同的数据库,同样,我有大量的app.config文件,包含大量的细节。整个解决方案是使用.NET 3.5(C#)开发的。
当我的四个开发团队中的一个想要部署解决方案的某个部分的新版本并且需要更改所有配置文件时,我的问题就开始了。因为我的QA环境具有与生产环境不同的机器名称,所以我无法对配置文件进行简单的复制,我需要手动更改每个配置文件。并且,无论我的同事做了多少检查(甚至使用检查列表),一些配置保持不变,解决方案的某些部分停止。
有没有办法为所有应用程序创建唯一的配置文件?或者,至少将数据库连接字符串和Web服务URL集中在一个文件中以供所有应用程序使用?
P.S。:我无法更改部署团队,因为他们属于我的客户:(
答案 0 :(得分:2)
如果我理解正确,你想要分解一些'稳定'的设置
配置系统是分层的,您可以在中保存默认设置
C:\Windows\Micorsoft.NET\<version>\Machine.config
或Web.config
这是一个非常重要的工具。出错并且大多数.NET应用程序无法启动
使用ConfiguratonManager class从共享路径获取设置。这可能需要更改(所有)代码来读取设置。
答案 1 :(得分:2)
您可以使用configSource
部分中的connectionStrings
属性来包含外部连接字符串文件:
应用程序web.config
<configuration>
<connectionStrings configSource="connectionStrings.config" />
</configuration>
connectionStrings.config
<connectionStrings>
<add name="connection1" connectionString="..." />
</connectionStrings>
注意:正如marc_s在评论中建议的那样,configSource
属性可用于任何配置部分。
答案 2 :(得分:1)
您可以将外部xml文件包含到web.config中。
<!-- SomeProgram.exe.config -->
<configuration>
<connectionStrings configSource="externalConfig/connectionStrings.config"/>
</configuration>
<!-- externalConfig/connectionStrings.config -->
<connectionStrings>
<add name="conn" connectionString="blahblah" />
</connectionStrings>
答案 3 :(得分:1)
这是另一个想法(实际上我们如何解决配置问题)。也许这更符合您的需求。
我们的配置文件也相当大,但唯一真正改变的是配置字符串。
我们为每个配置都有一个文件,其中包含特定的配置字符串(用于开发的数据库,用于构建的数据库,用于QA的数据库)。文件如下所示:
<templates>
<template key="db" value="development server connection string"/>
<template .../>
</templates>
这些文件以(devel.xml, build.xml, qa.xml
)
在配置文件中,连接字符串由占位符(${db}
)替换。
我们为每个环境构建配置(开发,构建,qa)。构建此类配置时,后期构建事件将使用存储在模板文件中的值替换配置文件中的占位符。这会为每个环境生成正确的配置文件。
这个想法取自Managing Multiple Configuration File Environments with Pre-Build Events,但扩展了模板替换。
答案 4 :(得分:0)
您可以集中部分配置并动态加载该文件。见codeproject article