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

8

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

6个回答

4

我发现为每个环境准备多个配置文件非常有效。例如:

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

然后,我使用 web.config 或 app.config 中内置的 configSource 属性链接到“主”版本。

<appSettings configSource="config\endpoints.xml"/>

我会使用构建过程或部署过程将正确的环境配置复制到 web.config 所期望的名称。每个环境都有明确的标签和控制,而不需要混乱的占位符。

一旦我完成了后构建复制行,这个工作得很好。我还没有测试它的部署,但在本地调试中它可以工作。我有点失望的是,Visual Studio并没有以更简单的方式自动完成这个过程。 - James
是的,绝对正确。我也尽力在代码中配置尽可能多的内容,试图基于IPAddress或机器名称等内容实现“自感知”应用程序环境。但那是另一个完全不同的故事。 - Xian

2
一种方法是维护三个不同的配置文件,并在部署时通过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 任务,您可以重命名并将特定的配置文件推送到正确的位置。
虽然有点繁琐,但这具有向一步构建迈进的额外优势。

1
在下一个版本的Visual Studio中,这个功能已经被宣布为一个新特性。也许你可以在预构建脚本中完成它;根据configurationname环境变量替换配置文件。

【引用需要】:笑,这很有信息量,但你能否在其中编辑一个链接,并说明这将是哪个版本? - annakata
这是他们称之为配置转换的东西,它是新MSDeploy的一部分。我不确定它是否仅适用于Web。它在PDC上作为Web未来的一部分揭示了出来。在这里提到了它:http://blogs.msdn.com/webdevtools/archive/2008/12/30/vs-2010-for-web-developer-previews.aspx - Øyvind Skaar

1
另一个选项是将应用程序配置存储在数据库中。我将类型值保存在数据库中,以便更集中地管理这些设置。然后我的配置文件有一个专门用于Config的连接字符串,并且它只有两个键:唯一的应用程序ID值和配置版本(即“dev”,“test”等)。然后我只需将正确的配置文件部署到正确的环境中。
这可能不完全符合您的要求;它是促进配置数据管理的替代方案。

1
我对Xian的回答有问题,如果您添加了新的配置设置/端点,则必须记住在几个文件中进行更改。如果您忘记这样做,那么只有在部署到受影响的环境时才会发现(不好)。
相反,您可以拥有一个主配置,并使用正则表达式/xmlpoke(nant)/[your-favorite-text-manipulator]在构建/部署时对文件进行处理,以插入每个环境的正确值,将所有环境的设置保存在另一个文件中(但至关重要的是全部在一起)。
然后,您只需要维护一个配置文件和一个环境设置文件-我认为这使得长期维护更加容易和清晰。

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);

#如果是调试环境 debug.config

#如果是测试环境 test.config

#如果是生产环境 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);

虽然这可能会变得乏味。


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