在多个环境中工作

在多个环境中工作

原文: Working with Multiple Environments
作者: Steve Smith
翻译: 刘浩杨
校对: 孟帅洋(书缘)

ASP.NET Core 介绍了支持在多个环境中管理应用程序行为的改进,如开发(development),预演(staging)和生产(production)。环境变量用来指示应用程序正在运行的环境,允许应用程序适当地配置。

章节:

查看或下载示例代码

开发,预演,生产

ASP.NET Core 引用了一个特定的环境变量 ASPNETCORE_ENVIRONMENT 来描述应用程序当前运行的环境。这个变量可以被设置为任何你喜欢的值,但是有三个值被约定使用: DevelopmentStaging 和 Production。你会发现这些值在 ASP.NET Core 提供的示例和模板中被使用。

当前的环境设置可以通过编程方式从应用程序中被检测到。除此之外,你可以基于当前的应用程序环境在你的 view 里使用环境 tag helper 来包含某些部分。

注意
指定的环境变量名称不区分大小写。无论你把变量设置为 Development 或者 development或者 DEVELOPMENT 的结果将会是相同的。

开发

这应该是在开发应用程序时所使用的环境。当使用 Visual Studio 时,这个设置可以在项目的调试配置文件中指定,比如 IIS Express,在这里显示:

当你修改该项目创建的默认设置,你的更改会保留在 Properties 文件夹的 launchSettings.json 文件中。这个文件对于 Visual Studio 中每一个用来启动应用程序的配置文件都包含特定的设置,包括应该使用的任何环境变量。(在 servers 中更详细的讨论了调试配置文件)。例如,添加另一个 profile 配置来使用 IIS Express,使用 Staging 作为 ASPNETCORE_ENVIRONMENT 的值,在我们的示例项目中 launchSettings.json 文件如下图所示:

复制代码

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:40088/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express (Staging)": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging"
      }
    }
  }
}

注意
项目配置文件或 launchSettings.json 所做的更改在使用的 web 服务器重启之前可能不会直接生效(尤其是, kestrel 在将要检测它的环境变化之前必须重启)。

你可以为你的应用程序的不同配置文件创建多个不同的启动配置,包括它们需要的其他环境变量。

警告
环境变量存储在 launchSettings.json 不是安全的,并且将作为你的应用程序源代码仓库的一部分,如果你使用其中一个。 坚决不要在这个文件里存储证书或其他安全数据。 如果你需要一个地方来存储这些数据,使用 Safe storage of app secrets during development 里描述的 Secret Manager 工具。

预演

按照惯例, Staging 环境是用于部署到生产环境前进行最后测试的预生产环境。理想的情况下,它的物理特征应该是生产环境的真实写照,因此生产环境中可能出现的任何问题都首先发生在预演环境中,在这里可以解决它们而不影响到用户。

生产

Production 环境是应用程序运行的环境,它是活动的并且被终端用户使用。这个环境应该被配置为最大限度提高安全性,性能和应用程序的健壮性。生产环境不同于开发环境的一些通用的设置包括:

  • 启用缓存
  • 确保所有的客户端资源被打包,压缩和尽可能从CDN提供
  • 关闭诊断错误页面
  • 启用友好的错误页面
  • 启用生产日志和监控 (例如:Application Insights)

这并不是一个完整的列表。最好避免在你的应用程序各个部分散乱的环境检查。相反,推荐的方式是尽可能在应用程序的 Startup 类中进行这样的检查。

在运行时确定环境

IHostingEnvironment 服务为工作环境提供了核心抽象。该服务由 ASP.NET 宿主层提供,并且能够通过Dependency Injection 注入到你的启动逻辑中。在 Visual Studio 中的 ASP.NET Core 网站模板使用这种方式来加载特定的环境配置文件(如果存在的话)并且自定义应用程序的错误处理设置。在这两种情况下,这种行为是由通过参照当前指定的环境来调用 IHostingEnvironment 的实例上的 EnvironmentName 或IsEnvironment 上传递到适当的方法来实现。

注意
如果你需要检查该应用程序是否在特定环境中运行,使用 env.IsEnvironment("environmentname") 因为它会正确的忽略大小写(而不是检查例如 env.EnvironmentName == "Development" )。

例如,你可以使用如下代码在你的配置方法中设置特定环境的错误处理:

复制代码

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }
    // ...

如果应用程序运行在 Development 环境中,那么它在 Visual Studio 中开启必要运行时支持来使用浏览器链接(BrowserLink)功能,特定的开发错误页面(这通常不应该在生产中运行)和特定的数据库错误页面(它提供了一种应用迁移的方法,因此应该仅在开发中使用)。另外的,如果应用程序不是在开发环境中运行,配置一个标准的错误处理页面来显示响应中的任何未处理异常。

你可能需要在运行时确定需要向客户端发送哪些内容。例如,在开发环境中你通常提供非最小化的脚本和样式表,这更容易调试。在生产和测试环境一般应当从 CND 提供最小化的版本。你可以使用环境 tag helper做到这一点。如果当然环境与使用 names 特性指定的环境相匹配,环境 tag helper 将只提供它的内容。

复制代码

<environment names="Development">
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
          asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
    <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>

在你的应用程序开始使用 tag helpers 查看 tag helper

启动约定

ASP.NET Core 支持一种基于约定的方法来根据当前环境配置应用程序的启动。依据你的应用程序在哪一种环境,你也可以使用编程的方式控制应用程序的行为,允许你创建和管理你自己的约定。

当 ASP.NET Core 应用程序启动, Startup 类用来引导应用程序,加载其配置设置等(学习更多关于ASP.NET startup)。然而,如果一个类的命名存在 Startup{EnvironmentName} (例如 StartupDevelopment),并且 Hosting:Environment 环境变量和它的名称相匹配,那么则使用那个 Startup 类。

除了使用一个基于当前环境的完全独立的启动类,你也可以在 Startup 类中对应用程序如何配置做出调整。Configure() 和 ConfigureServices() 方法类似 Startup 类,以 Configure[EnvironmentName]()和 Configure[EnvironmentName]Services() 的形式支持特定环境的版本。当设置为开发环境时,如果你定义一个 ConfigureDevelopment() 方法,将调用这个方法而不是 Configure()。同样,在相同的环境里将调用 ConfigureDevelopmentServices() 而不是 ConfigureServices()

概要

ASP.NET Core 提供了许多功能和约定来允许开发者更容易的控制在不同的环境中他们的应用程序的行为。当发布一个应用程序从开发到预演再到生产,为环境设置适当的环境变量允许对应用程序的调试,测试或生产使用进行适当的优化。

附加资源

时间: 2024-08-02 00:34:57

在多个环境中工作的相关文章

Exchange(2007/2010/2013)共存环境中IMAP和POP的工作方式

了解Exchange 2007.2010.2013共存环境中IMAP和POP的工作方式,对Exchange排错很有帮助. 我们需要知道Exchange 2013如何将IMP.POP请求转发到旧版本Exchange上,Exchange 2013 CAS接收到IMAP.POP请求时仍然是通过Proxy(代理)到目标服务器.通常Exchange 2013 ClientAccess Server接收到客户端的IMAP.POP请求时会执行两个操作:1).对请求进行认证(验收用户名和密码).2).执行IMA

Netsreen NSRP环境中如何同步配置

NSRP环境中如何同步配置 环境: 1.FW1为主设备 2.FW2为从设备 3.确定FW1上的配置为当前正常工作 以下命令在FW2上执行: nsisg2000(B)-> exec nsrp sync global save 随后将出现以下输出: nsisg2000(B)-> load peer system config to save Save global configuration successfully. Continue to save local configurations .

如何将linux用在开发环境中的

如何将linux用在开发环境中的 1.我为什么要写这篇文章 一直想深入学习一下linux的使用,于是将家里的笔记本装了linux系统,但是要将自己的系统打造一个适合开发的环境确实是一件费心费力的事,而且会经常出现一些莫名其妙的问题,以我自己的使用经验觉得要想用linux做开发环境,你要了解每个软件,不然出现一些问题就很难解决,其他不说,就是光搞好驱动问题就让人蛋疼了. 我的电脑装了linux之后一直高温不下,在网上找了一些方法,关掉独显也好不了多少,开机2个小时温度就飙到70-90度,试过很多发

EhCache缓存在集群环境中同步问题

由于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,当每一个节点维护各自的缓存数据,某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享,这不仅会降低节点运行的效率,而且会导致数据不同步的情况发生.例如某个网站采用 A.B 两个节点作为集群部署,当 A 节点的缓存更新后,而 B 节点缓存尚未更新就可能出现用户在浏览页面的时候,一会是更新后的数据,一会是尚未更新的数据,尽管我们也可以通过 Session Sticky 技术来将用户锁定在某个节点上,但对于一些交互性比较强

在C7000+VMware vSphere5.5环境中的基础架构服务器部署实例

主题:使用HP C7000设备在VMware vSphere环境中部署企业高可用性基础架构服务器 目标:在C7000中使用BL460G8部署VMware vSphere服务器虚拟化方案,完成企业级高可用性基础架构服务. 硬件 1:1台HP C7000刀框 2:3台HP BL460G8服务器 3:2个HP Virtual Connect FlexFabric 10Gb/24-port Module 4:1台HP P4500存储 需要的图表 设计整体逻辑拓扑图 配置信息参数图表 IP地址规划图表 E

[virtualenv]生产环境中使用virtualenv

virtualenv 对于python开发和部署都是好工具,可以隔离多个python版本和第三方库的版本,这里作者总结了几个常用python服务怎么样结合virtual部署 原文链接 Python 中我最喜欢的东西之一就是可以使用 virtualenv 去创建隔离的环境.非常简单的就可以在不同的项目中部署不同的python类库. 有一个比较棘手的问题就是在生产环境中使用virtualenv 部署几个不同的服务有一些配置上的不同. 于是我就从我的项目中收集了几种不同的服务的不同配置方式. 可以肯定

.NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一些列是使用.NET/C#来展现,但是同样适用于其他类似的OO技术平台,这些技术点可能称不上完整的技术,但是它是经验的总结,是掉过多少坑之后的觉醒,所以有必要花几分钟时间记住它,在真实的项目开发中你就知道是多么的有帮助.好了,废话不说了,进入主题. 我们在开发服务时为了调试方便会在本地进行一个基本的模块测试,你也可以认为是集

python环境中运行程序

运行Python程序,我们比较常用的是直接在Windows命令提示窗口或者Linux终端或shell窗口中,直接:Python *.py,或者在Linux环境下,在投不中,加入: #!/usr/bin/env python 然后 ./*.py 直接运行 但是进入Python后,该怎么运行呢? 这里就简单介绍一下,这里先简单介绍下os的部分功能. import os; #在Python环境中,引入环境,是必须的:具体可以查看Python中的os os.getcwd(); #得到当前工作目录 os.

在VS2103环境中集成Doxygen工具

自己已将学习了两三次了吧,差不多这次该总结一下: Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C++.Java.Objective-C和IDL语言,部分支持PHP.C#.注释的语法与Qt-Doc.KDoc和JavaDoc兼容.Doxgen可以从一套归档源文件开始,生成HTML格式的在线类浏览器,或离线的LATEX.RTF参考手册. Doxygen 是一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件.通常我们在写程序时,或多或少都会写上批注,但