【问题标题】:How to configure the environment of an ASP.NET application?如何配置 ASP.NET 应用程序的环境?
【发布时间】:2012-01-05 15:03:20
【问题描述】:

允许 ASP.NET 应用程序知道它在哪个环境中运行的推荐方法是什么?我的应用程序可以在这些环境中运行:

  • 在 Visual Studio 中调试
  • 自动化系统测试
  • 在临时服务器上部署
  • 在生产服务器上部署

在每种环境中,应用程序都需要一些不同的配置。环境之间的主要区别在于使用的数据库连接设置,但也有其他区别。

这是我尝试过的:

  • 我尝试在 Visual Studio 中使用“配置”选项。默认有两个:Release 和 Debug。我试图用我的四个环境的标识符替换这两个。然后可以使用这些配置将转换应用于 Web.config 文件。这里的问题是选择配置发生在构建时,我想编译我的应用程序,然后选择环境,然后在 Web 服务器上运行它。在 Visual Studio 中调试时也不会发生 Web.config 转换,因此它不会告诉应用程序它在调试环境中运行,而是没有环境。我在Use Visual Studio web.config transform for debugging 找到了一种解决方法,但它似乎效果不佳。我必须更改项目属性中的配置,这是一个缓慢的过程。
  • 我尝试过使用环境变量。这样我可以从应用程序外部设置一个变量 MYAPP_ENV=dev,我可以在 C# 中将其读取为
    字符串 env = System.Environment.GetEnvironmentVariable("MYAPP_ENV");
    但是我不确定如何在 Visual Studio 和 IIS 中设置这个环境变量。我无法在机器上全局设置它,因为同一台机器需要能够在多个环境中运行应用程序。

那么,在 ASP.NET 中推荐的方法是什么?在 Ruby on Rails 中,我将使用 RAILS_ENV 环境变量,在 PHP 中,我将包含一个文件,该文件未检入存储库并添加到版本控制系统的忽略列表中。

【问题讨论】:

  • 不清楚您是否正在这样做,但我会尽量避免使用编写环境特定代码(即if env=="dev" { } else { },因为那样您的站点在不同环境中的行为会有所不同。任何需要更改的值应该在配置文件中更改(请参阅 AaronS 答案)。

标签: c# asp.net .net web-config environment


【解决方案1】:

我会为您的每个环境提供单独的 web.config 文件。

或者,您也可以通过添加外部配置文件来设置类似于您对 PHP 包含文件所做的设置。

只需将以下内容添加到您的 web.config。

<appSettings file="MySettings.config">

然后添加一个名为 MySettings.config 的新文件,其中包含您的其余配置信息。

【讨论】:

  • +1。为了帮助维护单独的 web.config,我建议在 Visual Studio 中利用 config transforms
  • AronS:这听起来很有趣。如何设置 Visual Studio 以在我开始调试 (F5) 时运行我的应用程序之前自动将一个值放入 M​​ySettings.config 文件?当我在生产中的 IIS 上部署它时,这个 MySettings.config 文件是否会在我的应用程序的 dll 旁边可用?基思:正如我最初写的那样,看起来转换只能作为构建过程的一部分进行,而且还有其他复杂的情况似乎使它无法有效工作。
  • 您将执行的操作类似于您设置 PHP 版本的方式。只需在您的每个环境中都有此文件,并让您的部署工具忽略它。我实际上做的是在一个子文件夹中有多个版本的 web.config,为每个环境(web.config.QA、web.config.Prod 等)重命名。然后,我的构建和部署过程会根据正在执行的构建选择正确的一个,将其重命名为 web.config,然后在部署站点时替换根目录中的那个。这对我来说非常有效。
【解决方案2】:

web.config 文件用于环境配置。如果您发现 Visual Studio 中的配置过于繁琐,您可以让文件不受版本控制,并针对每个环境进行编辑。在 节点中,您可以添加键:

<appSettings>
    <add key="Environment" value="DEV" />   
</appSettings>

然后您可以通过 ConfigurationManager 类访问这些值

var currentEnvironment = ConfigurationManager.AppSettings["Environment"].ToString();

【讨论】:

  • 将整个 web.config 置于版本控制之外或为每个环境拥有一个版本没有多大意义,因为有很多东西必须在文件,但实际上与环境或配置无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2013-01-22
  • 1970-01-01
  • 2014-03-18
  • 2010-12-12
  • 2016-06-30
相关资源
最近更新 更多