204

我需要在我的 ASP.NET 应用程序中使用不同的数据库连接字符串和 SMTP 服务器地址,具体取决于它在开发或生产环境中运行。

应用程序通过WebConfigurationManager.AppSettings属性从 Web.config 文件中读取设置。

我使用 Build/Publish 命令通过 FTP 将应用程序部署到生产服务器,然后手动将远程 Web.config 替换为正确的。

是否有可能以某种方式简化部署过程?谢谢!

4

10 回答 10

172

在 Visual Studio 2010 及更高版本中,您现在可以根据构建配置对 web.config 应用转换。

创建 web.config 时,您可以在解决方案资源管理器中展开该文件,您将看到两个文件:

  • Web.Debug.Config
  • Web.Release.Config

它们包含可用于

  • 更改连接字符串
  • 删除调试跟踪和设置
  • 注册错误页面

有关详细信息,请参阅MSDN 上的 Web 应用程序项目部署的 Web.config 转换语法。

尽管官方不支持,也可以将相同类型的转换应用于非 Web 应用程序app.config文件。请参阅Phil Bolduc 博客,了解如何修改项目文件以向 msbuild 添加新任务。

这是对 Visual Studio Uservoice 的长期要求

Visual Studio 2010及更高版本的扩展“ SlowCheetah ”可用于为任何配置文件创建转换。从 Visual Studio 2017.3 开始,SlowCheetah 已集成到 IDE中,代码库由 Microsoft 管理。这个新版本还支持 JSON 转换。

于 2010-06-17T18:46:19.823 回答
85

web.config 中的<appSettings>标签支持文件属性,该属性将使用自己的一组键/值加载外部配置。这些将覆盖您在 web.config 中的任何设置或添加到它们。

我们通过在安装时使用与站点安装环境相匹配的文件属性修改我们的 web.config 来利用这一点。我们通过安装程序的开关来做到这一点。

例如;

<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">

<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">

笔记:

  • 对属性指定的 .config 的更改不会触发 asp.net 工作进程的重新启动
于 2008-11-20T15:55:36.083 回答
24

您是否查看过 Web 部署项目?

http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en

如果您不在 2008 上,也有一个适用于 VS2005 的版本。

于 2008-11-20T14:36:50.207 回答
13

我也想知道。这有助于为我隔离问题

<connectionStrings configSource="connectionStrings.config"/>

然后我保留一个 connectionStrings.config 以及一个“{host} connectionStrings.config”。这仍然是一个问题,但是如果您对两个环境中不同的部分执行此操作,您可以部署和版本相同的 web.config。

(而且我不使用VS,顺便说一句。)

于 2008-11-20T14:38:53.167 回答
6

我使用 NAnt 构建脚本来部署到我的不同环境。我让它通过 XPath 修改我的配置文件,具体取决于它们被部署到的位置,然后它使用Beyond Compare自动将它们放入该环境中。

设置需要一两分钟,但您只需执行一次。然后批处理文件接管,而我去拿另一杯咖啡。:)

这是我在上面找到的一篇文章。

于 2008-11-20T14:54:44.023 回答
5

在一个项目中,我们有 4 个环境(开发、测试、登台和生产),我们开发了一个系统,应用程序根据部署到的机器名称选择适当的配置。

这对我们有用,因为:

  • 管理员可以在不涉及开发人员的情况下部署应用程序(要求),也不必摆弄配置文件(他们讨厌);
  • 机器名称遵循约定。我们使用正则表达式匹配名称并部署到环境中的多台机器上;和
  • 我们对连接字符串使用了集成安全性。这意味着我们可以在设计时将帐户名保留在配置文件中,而不会泄露任何密码。

在这种情况下,它对我们很有效,但可能不会在任何地方都有效。

于 2008-11-20T15:24:55.960 回答
3

企业库配置编辑器可以帮助您做到这一点。它允许您创建一个基本配置文件,然后为每个环境创建增量。然后,您可以合并基本配置和增量以创建特定于环境的 web.config。看看这里的信息,它比我能更好地帮助你完成它。

于 2008-11-20T14:45:14.993 回答
3

您也可以将其作为后期构建步骤。除了调试和发布之外,设置一个“部署”的新配置,然后将构建后的步骤复制到正确的 web.config 上。

我们对所有项目都使用自动构建,并且构建脚本会更新 web.config 文件以指向正确的位置。但是,如果您从 VS 做所有事情,那将无济于事。

于 2008-11-20T14:52:53.200 回答
3

这是使用 machine.config 的巨大好处之一。在我上一份工作中,我们有开发、测试和生产环境。我们可以将 machine.config 用于连接字符串(到适当的 dev/test/prod SQL 机器)之类的东西。

如果您无法访问实际的生产机器(例如,如果您在共享主机上使用托管公司),这可能不是您的解决方案。

于 2008-11-20T15:13:03.270 回答
1

您还可以使用扩展“配置转换”的工作方式与“SlowCheetah”相同,

于 2019-12-04T08:58:45.237 回答