Asp.net 一个网络配置中有多个网络配置

Asp.net 一个网络配置中有多个网络配置,asp.net,web-config,Asp.net,Web Config,我们的站点有一个生产服务器和一个开发服务器。我有不同的设置和许可证信息,分别保存在2个不同的web.config文件中 有没有办法将它们合并到一个web.config文件中?这样在发布站点时,我就不会用开发覆盖生产(反之亦然)。您可以创建一个web部署项目(,),它是一个XML MSBuild文件,在为特定概要文件生成时,您可以在配置文件中替换/插入/替换XML节点。您可能需要花半天到一天的时间来正确配置它,但这是非常值得的,因为它可以为您节省大量部署方面的麻烦(还可以让您更接近一键部署) 注意

我们的站点有一个生产服务器和一个开发服务器。我有不同的设置和许可证信息,分别保存在2个不同的web.config文件中


有没有办法将它们合并到一个web.config文件中?这样在发布站点时,我就不会用开发覆盖生产(反之亦然)。

您可以创建一个web部署项目(,),它是一个XML MSBuild文件,在为特定概要文件生成时,您可以在配置文件中替换/插入/替换XML节点。您可能需要花半天到一天的时间来正确配置它,但这是非常值得的,因为它可以为您节省大量部署方面的麻烦(还可以让您更接近一键部署)

注意:对于VS2008 web部署项目,您可能希望使用。我不知道VS2010在执行这些任务时的状态是什么——它们是否仍然是必需的

对于使用MSBuild社区任务(我们在VS2010下使用)的VS2008 web部署任务,它看起来有点像

<!-- ... -->
<Target Name="AfterBuild">
    <XmlMassUpdate Condition="'$(Configuration)|$(Platform)' == 'Release - Dev|AnyCPU'" ContentFile="$(OutputPath)\web.config" SubstitutionsFile="$(OutputPath)\web.Substitutions.config" ContentRoot="/" SubstitutionsRoot="/configuration/substitutions/dev" />
</Target>
<!-- ... -->

值得一提的是,我们使用它来运行web部署项目,而不需要额外的配置,而且它可以顺利工作。是相同的方法(并且设置起来更容易一些)。

只有一种可能性,但是您可以根据上下文为值指定适当的名称来合并它们,并使用代码中的编译常量有条件地访问每个元素。例如,在web.config中,您可能有

<connectionStrings>
    <add name="DevelopmentConnection" connectionString="DevelopmentConnectionString" />
    <add name="DeploymentConnection" connectionString="DeploymentConnectionString" />
</connectionStrings>
public static class Configuration
{
    public string ConnectionString
    {
        get
        {
            #if DEBUG
                return ConfigurationManager.ConnectionStrings["DevelopmentConnection"].ConnectionString;
            #else
                return ConfigurationManager.ConnectionStrings["DeploymentConnection"].ConnectionString;
            #endif
        }
    }
}

现在,考虑到已定义调试常量,那么,在按环境构建时,使用此属性将完成相应的设置。

对于VS 2010,您可以通过web.config转换和构建配置来完成此操作。Scott Guthrie写到:

我认为这基本上是通过创建额外的配置文件(如Web.Debug.config)和VS自动将它们“链接”到IDE中的主Web.config来实现的,但是我无法在我现在使用的计算机上验证它,因为它没有VS 2010

在旧版本的VS中,您也可以很容易地使用构建事件来实现这一点,但这并没有那么好。斯科特实际上也写过这个:

(摘自Scott的博客文章)这里是实现这一目标的高级步骤。它们同时适用于VS 2005和VS 2008

  • 使用ASP.NET Web应用程序项目(具有基于MSBuild的项目文件)
  • 打开VS Configuration Manager并为您的项目和解决方案创建新的“开发”、“质量保证”、“暂存”构建配置
  • 在项目中添加新的“web.config.dev”、“web.config.qa”和“web.config.staging”文件,并自定义它们以包含应用程序特定于模式的配置设置
  • 向项目文件中添加一个新的“pre-build event”命令,该命令可以在每次生成项目时自动通过项目中的web.config文件以适当的特定于模式的版本进行复制(例如:如果您的解决方案处于“Dev”配置中,它会将web.config.Dev设置复制到主web.config文件)

  • 这种方法的一个大问题是,访问您的开发环境的人可能比访问生产环境的人多。这将使这些人能够访问您的生产部署字符串之类的内容,这是一件非常糟糕的事情。我刚才键入的许多内容由于网络中断而丢失,所以我只想继续讨论最尖锐的一点:在任何这样的环境中,这样的敏感数据都应该被加密。你必须有某种可以解密和读取这些数据的东西,这通常意味着你已经开发出了这样的东西。这意味着任何有权访问上述开发代码的人都可以对其进行解密。微软为此向我们提供了aspnet_regiis。危险无处不在,只能减轻,重要的是你愿意爬多远——你可以用什么逻辑说开发人员自己可能会发疯,对自己和其他人(包括数据库连接字符串)都是一种危险——请看:这正是我在寻找的。谢谢
    public static class Configuration
    {
        public string ConnectionString
        {
            get
            {
                #if DEBUG
                    return ConfigurationManager.ConnectionStrings["DevelopmentConnection"].ConnectionString;
                #else
                    return ConfigurationManager.ConnectionStrings["DeploymentConnection"].ConnectionString;
                #endif
            }
        }
    }