我有一个Web服务需要针对不同环境的不同设置(debug,test,prod)。为这些不同的环境设置单独的配置文件的最简单方法是什么?我在网上找到的所有内容都告诉我如何使用配置管理器来检索设置,而不是如何根据当前的构建配置查找特定设置。
答案 0 :(得分:4)
我发现每个环境都有多个配置文件。即:
然后我使用web.config或app.config中的内置configSource属性链接到其“master”版本,例如
<appSettings configSource="config\endpoints.xml"/>
然后,我将使用构建过程或部署过程将环境的正确配置复制到web.config期望的名称。
每个环境都有明确的标签和控制,不需要杂乱的占位符。
答案 1 :(得分:2)
一种方法是维护3个不同的配置文件,并在部署时通过MSBuild选择它们。
<Choose>
<When Condition="$(BuildEnvironment) == 'debug'">
<PropertyGroup>
<ConfigFile>debug.config</ConfigFile>
</PropertyGroup>
</When>
<When Condition="$(BuildEnvironment) == 'test'">
<PropertyGroup>
<ConfigFile>test.config</ConfigFile>
</PropertyGroup>
</When>
<When Condition="$(BuildEnvironment) == 'prod'">
<PropertyGroup>
<ConfigFile>prod.config</ConfigFile>
</PropertyGroup>
</When>
</Choose>
通过使用MSBuild任务,您可以重命名特定配置文件并将其推送到正确的位置。
仍然有点麻烦,这有一个额外的优势,即走向one step build。
答案 2 :(得分:1)
在Visual Studio的下一个版本中,这个特性已被宣布为新功能。 也许你可以在prebuild脚本中做到这一点;根据configurationname env变量替换配置文件。
答案 3 :(得分:1)
另一种选择:切换到将应用程序配置存储在数据库中。我将类型值保存在数据库中,以便更集中地管理这些设置。然后我的配置文件有一个专用于Config的连接字符串,它只有两个键:唯一的应用程序ID值和配置版本(即“dev”,“test”等)。然后我只是将正确的配置文件部署到正确的环境中。
这可能不是你想要的;它是便于管理配置数据的替代方案。
答案 4 :(得分:1)
我对西安回答的问题是,如果你添加一个新的配置设置/端点,你必须记住在几个文件中做到这一点。如果您忘记这样做,那么您只会知道何时部署到受影响的环境(不好)。
相反,您可以使用一个主配置并使用regex / xmlpoke(nant)/ [your-favorite-text-manipulator]在构建/部署时按摩文件,为每个环境插入正确的值,保持设置为另一个文件中的所有环境(但最重要的是一起)。
然后你只需要维护一个配置文件和一个环境设置文件 - 我认为这样可以使维护更容易,更长久。
答案 5 :(得分:0)
我们使用了一些不同的方法。
Environment.MachineName.config(对于用户)
System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap();
if (System.IO.File.Exists(String.Format("./{0}.config", Environment.MachineName)))
fileMap.ExeConfigFilename = String.Format(@"./{0}.config", Environment.MachineName);
else
fileMap.ExeConfigFilename = "live.config";
System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);
#IF DEBUG debug.config
#IF TEST test.config
#IF PROD prod.config
System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap();
#if (DEBUG)
fileMap.ExeConfigFilename = "./debug.config";
#elif (TEST)
fileMap.ExeConfigFilename = "./test.config";
#else
fileMap.ExeConfigFilename = "./production.config";
#endif
System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);
虽然可能会变得单调乏味。
答案 6 :(得分:0)
使用预编译指令。示例代码:
String configFile = String.Empty;
#if Debug
configFile = @"debug.config";
#elif Test
configFile = @"test.config";
#elif Prod
configFile = @"prod.config";
#endif
Load(configFile);
Load方法加载配置文件。