如何设置特定于解决方案配置的配置文件?

时间:2009-01-05 21:44:51

标签: c# visual-studio web-services

我有一个Web服务需要针对不同环境的不同设置(debug,test,prod)。为这些不同的环境设置单独的配置文件的最简单方法是什么?我在网上找到的所有内容都告诉我如何使用配置管理器来检索设置,而不是如何根据当前的构建配置查找特定设置。

7 个答案:

答案 0 :(得分:4)

我发现每个环境都有多个配置文件。即:

  • 设置\ local.endpoints.xml
  • config \ dev.endpoints.xml
  • config \ test.endpoints.xml
  • config \ staging.endpoints.xml
  • config \ prod.endpoints.xml

然后我使用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方法加载配置文件。