使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发
2016-07-28 00:27
1571 查看
本篇将演示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} 可以在不同的环境变量下执行不同的代码。
相关文章推荐
- asp.net mvc实现简单的实时消息推送
- ASP.NET MVC5验证系列之Remote Validation
- raspbian安装 firefox
- raspbian 与 recalbox 同时安装
- 搭建第一个web项目:jasperReports+ireport制作pdf报表
- ASP.NET--Razor-model-compare属性用法
- aspx脱离源代码管理
- 在IIS中访问APS页面时提示:“最可能的原因使用的托管的处理程序,但是未安装或未完整安装asp.net“
- 树莓派 Learning 002 装机后的必要操作 --- 01 解决上网问题
- 树莓派 Learning 002 装机后的必要操作 --- 02 解决中文问题
- VB,VBS,VBA,ASP可引用的库参考
- Excel导入---后台下载
- (入门整理学习一)Asp.net core
- 导出Excel--不用安装office
- 使用 asp.net Web API 2的坑
- ASP中生成文本文件的两种方式
- asp.net单点登录(SSO)解决方案,一个实例
- Asp.NET设置Session过期时间的四种方式
- Spring AOP AspectJ切入点语法详解,execution,within,this.......
- 解决asp.net mvc的跨域请求问题