【问题标题】:How do you deal with connection strings when deploying an ASP.NET site?部署 ASP.NET 站点时如何处理连接字符串?
【发布时间】:2010-09-15 21:06:45
【问题描述】:

现在我们的测试和生产数据库位于同一台服务器上,但名称不同。部署意味着编辑 Web.config 以更改正确数据库的所有连接字符串。一个我经常忘记的步骤......

我们终于创建了一个新的数据库服务器进行测试,我正在移动数据库...但是现在服务器将有所不同,我们仍然需要处理连接字符串问题。

我曾考虑通过 hosts 文件对其进行管理,但每当我需要针对生产数据进行测试时,在我的台式机上切换它的想法充其量似乎很麻烦。

所以我只是想知道是否有更好的方法。使用“生产”网络配置构建以进行部署的东西将是理想的......

【问题讨论】:

    标签: asp.net deployment


    【解决方案1】:

    我最近一直倾向于在持续集成服务器上进行配置操作。那是因为我们遇到了多个 web.config、web.qa.config、web.production.config 保持 95% 应该是相同的文件同步的问题。

    简而言之:源代码管理中只有一个 web.config,它是开发配置(调试友好、本地数据库等)。构建服务器进行编译,然后部署到金丝雀站点,然后是候选发布包。

    我们使用的是 nant,因此它是具有 xmlpoke 设置 debug="false"、更改连接字符串以及在金丝雀副本和 web.config 的打包副本中需要更改的任何其他内容的 .build 文件。

    构建机器的部署被称为“金丝雀”,因为如果出现问题,它是第一个死去的东西。

    【讨论】:

      【解决方案2】:

      我们从 CI 服务器驱动我们的部署。我们通常对每个位置都有一个单独的文件,并让 CI 服务器根据传递给它的参数切换到适当的配置。所有文件编辑都是在 NAnt 脚本中完成的,因此开发人员可以在他们的机器上运行 sam 构建以获取他们自己的设置。

      【讨论】:

        【解决方案3】:

        我现在去过一些将它们存储在注册表中的地方。

        现在可能有更精细的方法可以做到这一点,但我使用 1.0/1.1 遗产处理的许多代码将字符串存储在注册表中。

        注册表有几个优点

        1. 它可以防止人们将代码部署到错误的位置,因为未正确配置的机器将缺少密钥
        2. 它消除了以下问题:开发人员会不小心将包含开发连接字符串的 web.config 文件打包在其中(随后在半夜疯狂打电话,其中显示深夜系统管理员没有回升级以前的 web.config 并且开发人员不知道或不记得生产字符串)
        3. 它限制了黑客通过从机器上获取 web.config 来获取连接字符串的可能性。此外,注册表比文件系统具有更高级别的安全性。

        【讨论】:

        • 有趣!我想知道 MSDAAB 和其他 DALS/ORMS 等库是否可以利用这一点。尽管在手动完成数据访问的情况下,我可以看到这完全有效。
        【解决方案4】:

        这种任务正是构建事件旨在解决的问题。将构建视为针对特定目标的构建,任何目标特定配置都应该在那里完成。 (通常需要注意的是,规则总是有一些例外)

        【讨论】:

          【解决方案5】:

          我在每台服务器上创建一个数据库别名来指向数据库。然后我在我的 web.config 文件中使用这个别名。如果我需要更改应用程序指向的数据库,那么我更改别名而不是 web.config。

          对于 SQL Server,请转到 SQL Server 配置管理器 > SQL Native Client 配置 > 别名 > 创建新别名。

          您可以使用 tnsnames 文件对 Oracle 执行相同的操作。

          【讨论】:

            【解决方案6】:

            我会将我的连接字符串放在我们的 QA 和生产框的 machine.config 中。不过,为了灵活性,我会将它们保存在我的开发盒上的 web.config 中。然后,在部署到 QA 时,我将使用 Web 部署项目来覆盖我的开发连接字符串(没有连接字符串)。因此,QA 站点依赖于 machine.config 中的连接字符串。我仍然手动部署到生产以确保一切成功。我通过手动将所有内容从 QA(web.config 除外)复制到生产环境来做到这一点。

            【讨论】:

              【解决方案7】:

              您可以尝试以下另一件事:

              使用 SQL Server 配置管理器,为您的开发数据库创建一个 db Alias,以便您的开发服务器和生产服务器上的 web.config 文件可以相同。

              【讨论】:

                【解决方案8】:

                使用Web Deployment Project 并使用一些后期构建任务更新 wdproj 文件(它只是一个 MSBuild 文件)以输出正确的 .config 文件。我保留一个 web.config 和 web.release.config 然后在 wdproj 文件中使用它:

                <Target Name="AfterBuild">
                    <Copy Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " SourceFiles="$(SourceWebPhysicalPath)\web.release.config" DestinationFiles="$(OutputPath)\web.config" />
                    <Delete Files="$(OutputPath)\web.release.config" />
                </Target>
                

                More information

                一个更简单的解决方案是使用configSource property of appSettings and connectionStrings,然后永远不会覆盖生产服务器上的那个文件。

                【讨论】:

                • 我应该假设这与 VS2008 中的“Web 设置项目”相同吗?看起来这可能是个好主意...
                • 没有。这是一个额外的下载。请参阅我的答案中的第一个链接
                • 您的链接是针对 VS2005...我希望他们决定将其包含在 VS2008 中。
                • 我的回答中的第一个链接是针对 2008 版的
                【解决方案9】:

                我经常这样做,我将生产服务器上的 web.config 设为只读。

                【讨论】:

                  【解决方案10】:

                  我通常有三个独立的 Web 配置:一个用于我的开发机器,一个用于 QA,一个用于生产。开发版连接到我的本地 SQL 数据库(外部有防火墙),它是默认的 web.config。其他名为 web-prod.config 和 web-qa.config。发布后,我删除了两个我不需要的并将正确的重命名为 web.config。如果我忘记了,应用程序在第一次尝试访问数据库时会中断,因为默认配置引用了它无法访问的配置。

                  由于 IIS 拒绝提供名为 .config 的文件,我确保它们都以 .config 结尾,而不是 web.config-prod 或 web.config-qa。

                  【讨论】:

                  • 这些数据库太大,无法在 SQL Express 中运行……但我想我可以使用我们的防火墙来确保生产版本不会连接到错误的数据库。
                  • 我在本地安装了 SQL Server 的开发人员版本,而不是 SQL Express。无论如何,我永远不会在我的本地系统上拥有整个生产数据,只有一些测试数据。
                  【解决方案11】:

                  每个环境都有单独配置的环境文件夹

                  为环境部署正确的一个

                  【讨论】:

                    猜你喜欢
                    • 2014-09-07
                    • 2013-08-22
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-01-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多