本篇将演示Asp.Net Core如何在多环境下进行开发适配。

在一个正规的开发流程里,软件开发部署将要经过三个阶段:开发、测试、上线,对应了三个环境:开发、测试、生产。在不同的环境里,需要编写不同的代码,比如,在开发环境里,为了方便开发和调试,前段js文件和css文件不会被压缩,异常信息将会暴露得更加明显,缓存一般也不会使用等等。而在测试环境里,为了更加接近生产环境,在开发采取的调试手段将会被屏蔽,同时为了能更好的测试发现问题,通常也会添加一些测试专用的服务和代码。最终在生产环境上,因为高效性、容错和友好性或者安全性等原因,某些功能会被屏蔽,某些功能将会被更加谨慎或者有效的手段代替。在这种情况下,需要能通过某种手段,使一套代码在不同环境下部署时能体现不同的特性。

第一部分、多环境标识

在.Net Core里,通过一个特殊的环境变量: ASPNETCORE_ENVIRONMENT 来标识多环境,默认情况下,会有下面三个值

  • Development:开发
  • Staging:预发布
  • Production:生产

借助不同的开发工具进行调试时,会有不同的配置方式。

在Visual Studio Code里

在 launch.json 里配置 ASPNETCORE_ENVIRONMENT 的值,这个文件在工程目录下的.vscode目录里,这个目录和里面的文件是在VS Code里开发调试时特有的。

 {
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceRoot}/bin/Debug/netcoreapp1.0/WebApiFrame.dll",
"args": [],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": false,
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
{
"name": ".NET Core Launch (web)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceRoot}/bin/Debug/netcoreapp1.0/WebApiFrame.dll",
"args": [],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"launchBrowser": {
"enabled": true,
"args": "${auto-detect-url}",
"windows": {
"command": "cmd.exe",
"args": "/C start ${auto-detect-url}"
},
"osx": {
"command": "open"
},
"linux": {
"command": "xdg-open"
}
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach",
"processId": 0
}
]
}

在这个配置文件的configurations节点下有三个json对象,分别对应着三种不同的启动方式,前两个分别对应着控制台启动和Web浏览器启动,最后一个采用附加进程的方式启动。

在前两种方式的配置里都有一个名字叫env的节点,节点里将配置 ASPNETCORE_ENVIRONMENT 的值。当采用这两种的任意一种方式启动时,可以看到控制台里将显示当前程序的环境标识。如果不配置这个环境变量,默认将是Production。

在Visual Studio 2015里:

在 launchSettings.json 里配置 ASPNETCORE_ENVIRONMENT 的值。这个文件在工程目录下的Properties文件夹里。这个文件夹和里面的文件也是在VS2015开发调试时里特有的。

 {
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:11974/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"ExampleTest": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "http://localhost:5000/",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

同样,这个文件也描述了两种启动调试的方式:IIS宿主启动和控制台启动,每种方式里都有一个environmentVariables节点,节点里将配置 ASPNETCORE_ENVIRONMENT 的值。

另外,在VS2015里也可以通过项目的属性可视化界面进行配置,最终的效果会同步修改 launchSettings.json 文件内容

在cmd窗口控制台里:

当使用cmd窗口进行启动时,可以使用下面的命令进行设置

通过 set 命令设置环境变量 ASPNETCORE_ENVIRONMENT 的值,然后通过 dotnet run 启动。

也可以通过设置当前机器的环境变量。设置好后需要重新打开cmd窗口,将环境变量读取到当前环境里。

第二部分、多环境判断

在.Net Core里,通过 IHostingEnvironment 接口来获取 ASPNETCORE_ENVIRONMENT 变量的相关信息。这个接口通过依赖注入的方式获取对应的实例对象。

 using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; namespace WebApiFrame
{
public class Startup
{
public IConfiguration Configuration { get; } public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json"); Configuration = builder.Build(); System.Console.WriteLine($"Current State: {env.EnvironmentName}");
System.Console.WriteLine($"Development State: {env.IsDevelopment()}");
System.Console.WriteLine($"Staging State: {env.IsStaging()}");
System.Console.WriteLine($"Production State: {env.IsProduction()}");
} public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<ConfigOptions>(Configuration.GetSection("CfgContent")); // 注入MVC框架
services.AddMvc();
} public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory, IHostingEnvironment env)
{
// 添加日志支持
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug(); // 添加NLog日志支持
//loggerFactory.AddNLog(); // 添加MVC中间件
app.UseMvc();
}
}
}

上面的代码在VS Code里调试时控制台输出的效果如下

在 Startup.cs 类里, IHostingEnvironment 接口可以作为构造函数和Configure方法的参数,通过依赖注入的方式获取实例。

通过实例的EnvironmentName属性可以获取到 ASPNETCORE_ENVIRONMENT 环境变量的值,同时也可以通过IsDevelopment、IsStaging和IsProduction方法快速判断属性值。

另外,也可以通过以下另外一种方式根据 ASPNETCORE_ENVIRONMENT 环境变量的值执行不同的代码

 using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; namespace WebApiFrame
{
public class Startup
{
public IConfiguration Configuration { get; } public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json"); Configuration = builder.Build(); System.Console.WriteLine($"Current State: {env.EnvironmentName}");
} // Development环境下执行的ConfigureServices方法
public void ConfigureDevelopmentServices(IServiceCollection services)
{
System.Console.WriteLine($"ConfigureDevelopmentServices Excuted.");
} // Development环境下执行的Configure方法
public void ConfigureDevelopment(IApplicationBuilder app, ILoggerFactory loggerFactory, IHostingEnvironment env)
{
app.Run(async context =>
{
await context.Response.WriteAsync("ConfigureDevelopment Excuted.");
});
} public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<ConfigOptions>(Configuration.GetSection("CfgContent")); // 注入MVC框架
services.AddMvc();
} public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory, IHostingEnvironment env)
{
// 添加日志支持
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug(); // 添加NLog日志支持
//loggerFactory.AddNLog(); // 添加MVC中间件
app.UseMvc();
}
}
}

启动调试,访问地址 http://localhost:5000/ ,查看控制台日志和页面内容

可以看到,通过特殊方法名 Configure{ASPNETCORE_ENVIRONMENT}Services 和 Configure{ASPNETCORE_ENVIRONMENT} 可以在不同的环境变量下执行不同的代码。

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发的更多相关文章

  1. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(十)-- 发布(Windows)

    本篇将在这个系列演示的例子上继续记录Asp.Net Core在Windows上发布的过程. Asp.Net Core在Windows上可以采用两种运行方式.一种是自托管运行,另一种是发布到IIS托管运 ...

  2. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(一)-- 起步

    本文记录了在Windows环境下安装Visual Studio Code开发工具..Net Core 1.0 SDK和开发一个简单的Web-Demo网站的全过程. 一.安装Visual Studio ...

  3. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试

    本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json 文件内容, ...

  4. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger

    本篇是在上一篇的基础上添加日志功能,并记录NLog在Asp.Net Core里的使用方法. 第一部分:默认Logger支持 一.project.json添加日志包引用,并在cmd窗口使用 dotnet ...

  5. [转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger

    本文转自:https://www.cnblogs.com/niklai/p/5662094.html 本篇是在上一篇的基础上添加日志功能,并记录NLog在Asp.Net Core里的使用方法. 第一部 ...

  6. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(七)-- 结构化配置

    本篇将记录.Net Core里颇有特色的结构化配置的使用方法. 相比较之前通过Web.Config或者App.Config配置文件里使用xml节点定义配置内容的方式,.Net Core在配置系统上发生 ...

  7. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入

    本篇将介绍Asp.Net Core中一个非常重要的特性:依赖注入,并展示其简单用法. 第一部分.概念介绍 Dependency Injection:又称依赖注入,简称DI.在以前的开发方式中,层与层之 ...

  8. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(五)-- Filter

    在上一篇里,介绍了中间件的相关内容和使用方法.本篇将介绍Asp.Net Core MVC框架的过滤器的相关内容和使用方法,并简单说明一下与中间件的区别. 第一部分.MVC框架内置过滤器 下图展示了As ...

  9. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(四)-- Middleware

    本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Middleware功能支持. 在演示Middleware功能之前,先要了解一下Asp ...

随机推荐

  1. 解决xcode打开时loading假死的问题

    症状如下: 点击打开xcode后,就一直会看到loading,但是CPU消耗很高,基本上就是死了(动弹不得),通过活动监测器看到xcode显示为“未响应” 以为是安装程序的问题,结果选中xcode拉到 ...

  2. 强大的JS数组

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  3. 使用POI读取excel文件内容

    1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...

  4. [ActionScript 3.0] AS3动态改变注册点

    package { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import fl ...

  5. 图标的使用————JAVA——Swing

    public class MyImageIcon extends JFrame{    public MyImageIcon()    {    JFrame jf=new JFrame();     ...

  6. How to Modify Public Network Information including VIP in Oracle Clusterware (文档 ID 276434.1)

    APPLIES TO: Oracle Database - Enterprise Edition - Version 11.2.0.3 to 12.1.0.2 [Release 11.2 to 12. ...

  7. 菜鸟-手把手教你把Acegi应用到实际项目中(10)-保护业务方法

    前面已经讲过关于保护Web资源的方式,其中包括直接在XML文件中配置和自定义实现FilterInvocationDefinitionSource接口两种方式.在实际企业应用中,保护Web资源显得非常重 ...

  8. POJ3264RMQ

    http://poj.org/problem?id=3264 #include<stdio.h> #include<string.h> #include<algorith ...

  9. SDUT 3346 数据结构实验之二叉树七:叶子问题

    数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...

  10. memcached搭建缓存系统

    Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能. 二.适用场合 1.分布式应用.由于memca ...