使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

时间:2022-09-07 15:09:53

本篇将演示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 Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

在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 文件内容

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

在cmd窗口控制台里:

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

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

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

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

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

第二部分、多环境判断

在.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里调试时控制台输出的效果如下

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

在 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/ ,查看控制台日志和页面内容

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

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

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

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

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

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

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

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

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

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

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

  5. &lbrack;转&rsqb;使用Visual Studio Code开发Asp&period;Net Core WebApi学习笔记(三)-- Logger

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

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

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

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

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

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

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

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

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

随机推荐

  1. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

  2. SQL Server 2008 数据库镜像部署实例之一 数据库准备

    SQL Server 2008 数据库镜像部署实例之一 数据库准备 一.目标 利用Sql Server 2008 enterprise X64,建立异步(高性能)镜像数据库,同时建立见证服务器实现自动 ...

  3. 网卡配置和DNS配置,手动挂在nas存储的共享目录,网络相关其它操作命令,修改防火墙中的端口配置,resolv&period;conf配置详细介绍和网卡信息配置详细介绍

    1.   网卡配置和DNS配置 若想服务器能够发邮件,需要让部署的服务器能够访问到外网环境.若部署的服务器访问不到外网,通过ping www.baidu.com的方式执行的时候,会出现以下问题: &q ...

  4. 手动增加swap空间

           在日常工作中,swap没有必要搞那么大的空间,因为现在好多服务器都使用了ssd硬盘,这些硬盘还是比较贵的.如果服务器内存是128G,swap空间还设置成内存的两倍的话,那岂不是很明显是很 ...

  5. IAR7&period;51提示秘钥无效IAR 以及 CCDebug驱动&lpar;包含win7 64bit&rpar;

    今天IAR不识别我的仿真器,然后我感觉驱动有问题,就把之前的驱动卸载了,但是按照以前的方法按章驱动(选择路径到IAR的某个目录),提示找不到驱动... 也不想重新装个IAR了,于是到CSDN上下载了这 ...

  6. asp&period;net session mode 几种状态 &lpar;转&rpar;

    开发asp.net应用时,修改web.config中的SessionState节点. stateserver模式: <sessionState mode="StateServer&qu ...

  7. shell脚本中的数据传递方式

    shell中支持的数据传递方式 主要有那么几种: 变量.管道.结果引用.重定向+文件.以及xargs. 变量方式: 1. 定义变量: 变量名=值 2. 使用变量: $变量名 管道方式: 统计当前文件夹 ...

  8. angularjs数据交互

    异步问题ajax异步请求数据完数据后给$scope赋值的时候需要检查$scope的数据更新没有.要不然无法绑定数据. <!DOCTYPE html> <html ng-app=&qu ...

  9. 解决JFinal多文件上传时只获取到第一个文件名

    我的思路: 用户生成时随即生成一串随机字符作为该用户的文件上传目录,并保存该字符串到用户的某一字段.需要显示上传的附件时,遍历这个文件夹.上传时可把文件名设置为上传时间. 1.生成上传路径 可写在注册 ...

  10. Python3 集合

    1.集合的表示 集合是一个无序不重复的元素序列 创建空集合 set() 2.集合的运算 a={1,2,3} b={2,3,4} print(a-b) #a中包含b中不包含 print(a|b) #a中 ...