原文: Working with Multiple Environments

作者: Steve Smith

翻译: 刘浩杨

校对: 孟帅洋(书缘)

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

章节:

查看或下载示例代码

开发,预演,生产

ASP.NET Core 引用了一个特定的环境变量 ASPNETCORE_ENVIRONMENT 来描述应用程序当前运行的环境。这个变量可以被设置为任何你喜欢的值,但是有三个值被约定使用: DevelopmentStagingProduction。你会发现这些值在 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 的实例上的 EnvironmentNameIsEnvironment 上传递到适当的方法来实现。

注意

如果你需要检查该应用程序是否在特定环境中运行,使用 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 提供了许多功能和约定来允许开发者更容易的控制在不同的环境中他们的应用程序的行为。当发布一个应用程序从开发到预演再到生产,为环境设置适当的环境变量允许对应用程序的调试,测试或生产使用进行适当的优化。

附加资源

返回目录

ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作的更多相关文章

  1. ASP.NET Core 中文文档 第三章 原理(2)中间件

    原文:Middleware 作者:Steve Smith.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) 章节: 什么是中间件 用 IApplicationBu ...

  2. ASP.NET Core 中文文档 第三章 原理(3)静态文件处理

    原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...

  3. ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化

    原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...

  4. ASP.NET Core 中文文档 第三章 原理(10)依赖注入

    原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...

  5. ASP.NET Core 中文文档 第三章 原理(17)为你的服务器选择合适版本的.NET框架

    原文:Choosing the Right .NET For You on the Server 作者:Daniel Roth 翻译:王健 校对:谢炀(Kiler).何镇汐.许登洋(Seay).孟帅洋 ...

  6. ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

    原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...

  7. ASP.NET Core 中文文档 第三章 原理(7)配置

    原文:Configuration 作者:Steve Smith.Daniel Roth 翻译:刘怡(AlexLEWIS) 校对:孟帅洋(书缘) ASP.NET Core 支持多种配置选项.应用程序配置 ...

  8. ASP.NET Core 中文文档 第三章 原理(8)日志

    原文:Logging 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐.许登洋(Seay) ASP.NET Core 内建支持日志,也允许开发人员轻松切换为他们想用的其他日 ...

  9. ASP.NET Core 中文文档 第三章 原理(12)托管

    原文:Hosting 作者:Steve Smith 翻译:娄宇(Lyrics) 校对:何镇汐.许登洋(Seay) 为了运行 ASP.NET Core 应用程序,你需要使用 WebHostBuilder ...

随机推荐

  1. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  2. 使用AWS亚马逊云搭建Gmail转发服务(三)

    title: 使用AWS亚马逊云搭建Gmail转发服务(三) author:青南 date: 2015-01-02 15:42:22 categories: [Python] tags: [log,G ...

  3. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  4. 基于ASP.NET/C#开发国外支付平台(Paypal)学习心得。

        最近一直在研究Paypal的支付平台,因为本人之前没有接触过接口这一块,新来一家公司比较不清楚流程就要求开发两个支付平台一个是支付宝(这边就不再这篇文章里面赘述了),但还是花了2-3天的时间通 ...

  5. SignalR SelfHost实时消息,集成到web中,实现服务器消息推送

    先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...

  6. Autofac - 属性注入

    属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...

  7. Oracle-BPM安装详解

    H3 BPM安装包括两个部分,基础工作包括安装IIS..net Freamwork基础框架.安装完成之后,主要配置安装包括数据库,H3 BPM 程序.下面详细介绍Oracle与H3 BPM对接安装的整 ...

  8. Android中AlarmManager使用示例(持续更新,已经更改)

    现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AtarmManager来实现.AtarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服 ...

  9. HTML5游戏源码 飞翔的字母 可自定义内容

    相信大家都玩过飞翔的小鸟吧,当然,可能已经有很多人因为这个游戏砸了不少手机.吼吼. 废话不多说,回到主题,源码如下. 博客园上传空间大小有限制,没法上传了,需要打包源码的朋友们请留言邮箱地址.当然还有 ...

  10. uboot环境配置

    uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...