ASP.Net Core MVC基础系列之环境设置
我们介绍了中间件的基本使用, 这一节我们讲一讲.net core的环境设置, 以及根据不同的环境加载不同的配置信息
ps: 由于最近一直比较忙, 一直没抽时间更新这个系列, 最近居多的博友催我, 所以继续挤挤时间更新这个系列, 感谢大家的对本系列教程的喜欢和支持.
在实际开发中, 我们的系统往往会是至少两个以上的运行环境, 最基本的就是, 开发环境和运营环境, 体系完整的公司, 还会有测试环境, 预发布环境, 和一些自定义环境等等, 这些环境使用的配置或是一些参数肯定是不一样的, 我们不可能为一个环境准备一份代码, 我们可以通过环境配置, 和 一些 if 判断, 就可以做到环境的自动切换, 下面就仔细说说.
我们先通过默认的.net core mvc设置, 感受一下. 以前的代码找不到了, 新建一个空的.net core mvc项目吧, 代码后面会提供下载.
ps: ide我已经使用vs2019
建好之后, 我们打开startup.cs代码文件, 看configure方法, 我相信, 有的博友已经发现了, 里面的第一行代码是个if, 意思就是判断当前环境是不是开发环境, 看单词的字面意思也是这个意思, 所以学好英文对开发程序有很大的buff加成啊~~~
对于if里的是什么, 已经讲过, 不再称述.
由此我们得出, 控制环境和判断环境, 都是在configure方法中, 注入的ihostingenvironment接口对象进行的. 这里我说一下, 系统默认提供的几个判断环境的方法. 我们使用env.is, vs的智能提示, 可以得到下面四个方法, 如图:
- isdevelopment方法大家已经知道了, 判断当前是不是开发环境.
- isproduction方法, 判断当前是不是运营(正式)环境
- isstaging方法, 判断当前是不是预运行环境
- isenvironment方法, 根据传入的环境名称, 判断是不是当前环境类型 (用于自定义环境判断)
我们修改一下configure方法的代码, 修改后为:
public void configure(iapplicationbuilder app, ihostingenvironment env) { if (env.isdevelopment()) { app.usedeveloperexceptionpage(); } app.run(async (context) => { context.response.contenttype = "text/plain;charset=utf-8"; //防止writeasync方法输出中文乱码 if (env.isdevelopment()) { await context.response.writeasync("开发环境", encoding.utf8); } else if (env.isproduction()) { await context.response.writeasync("运营环境", encoding.utf8); } else if (env.isstaging()) { await context.response.writeasync("预发布环境", encoding.utf8); } else { await context.response.writeasync("自定义环境", encoding.utf8); } }); }
然后f5运行, 浏览器会不出意外的输出: "开发环境"
没毛病, 我们修改一下编译环境, 把debug修改为release, 然后生成, 如图:
然后生成项目, 生成成功之后, 到项目的bin/release/netcoreapp2.2目录下, 打开cmd, 执行dotnetunit1.dll命令, 就会是这样的, 如图:
我们在浏览器输入http://localhost:5000/回车, 不出意外, 会输出: 运营环境 四个大字.
以上的流程, 就演示了最基本的开发环境和运营环境的配置和判断. 下面我们演示自定义环境. 我们接着修改代码, 为当前环境设置个名字, 代码如下
public void configure(iapplicationbuilder app, ihostingenvironment env) { if (env.isdevelopment()) { app.usedeveloperexceptionpage(); } env.environmentname = "cus"; //设置自定义环境名称 app.run(async (context) => { context.response.contenttype = "text/plain;charset=utf-8"; //防止writeasync方法输出中文乱码 if (env.isdevelopment()) { await context.response.writeasync("开发环境", encoding.utf8); } else if (env.isproduction()) { await context.response.writeasync("运营环境", encoding.utf8); } else if (env.isstaging()) { await context.response.writeasync("预发布环境", encoding.utf8); } else { await context.response.writeasync("自定义环境", encoding.utf8); } }); }
f5运行项目, 浏览器毫不意外的输出了: 自定义环境
如果我们要输出预发布环境的话, 只需要把environmentname 属性的值改成 "staging
" 即可, 这里不做演示, 自行尝试, 设置代码如下:
env.environmentname = "staging"; //设置为预发布环境
发设置为staging
和其它值的区别就是系统系统了一个isstaging方法
为了更加直观的演示自定义环境, 我们把else改一下, 改完之后的代码如下:
public void configure(iapplicationbuilder app, ihostingenvironment env) { if (env.isdevelopment()) { app.usedeveloperexceptionpage(); } env.environmentname = "cus"; //设置自定义环境名称 app.run(async (context) => { context.response.contenttype = "text/plain;charset=utf-8"; //防止writeasync方法输出中文乱码 if (env.isdevelopment()) { await context.response.writeasync("开发环境", encoding.utf8); } else if (env.isproduction()) { await context.response.writeasync("运营环境", encoding.utf8); } else if (env.isstaging()) { await context.response.writeasync("预发布环境", encoding.utf8); } else { if (env.isenvironment("cus")) { await context.response.writeasync("自定义环境: cus", encoding.utf8); } else if (env.isenvironment("cus1")) { await context.response.writeasync("自定义环境: cus1", encoding.utf8); } else { await context.response.writeasync($"自定义环境: {env.environmentname}", encoding.utf8); } } }); }
具体运行效果和预计的一样, 会输出对应的自定义环境
但是实际开发过程中, 我不推荐在代码里面修改当前环境, 而且通过项目的环境变量设置对应的环境, 具体修改方法如下
1: 点开properties
2: 打开launchsettings.json
3: 修改aspnetcore_environment的值.
我们修改environmentname属性的代码删掉, 修改launchsettings.json的配置为cus, 运行是什么效果, 修改后的效果如图
没出任何以外, 浏览器输出的是自定义环境: cus, 改成其它的值, 就输入对应的自定义环境, 修改为development就是开发环境,staging就是预运营环境,production就是运营环境
可能有人就要问了, 你只修改了上面的aspnetcore_environment, 下面还有一个aspnetcore_environment配置, 没修改, 怎么也可以. 别急, 马上就说明
.net core mvc程序, 提供了两种托管方式, 一种是通过iis托管, 一种是自托管, 我们刚刚修改的环境, 只修改了iis托管模式, vs默认又是iis调试, 所以, 会有效果
如果使用自托管模式调试或发布运行程序, 则修改下面的unit1节点的配置即可. 当然, vs也提供了调试方式, 切换方法, 点击运行模式即可, 如图:
选择unit1, 就是自托管模式啦~ , 然后f5运行, 浏览器输出的依然是开发环境, 虽然iis配置的是cus环境, 但是unit1自托管没有修改, 我们修改一下unit1的环境试试, 这里我修改为cus100, 然后选择unit1调试, f5运行, 浏览器输出的就是
没有任何问题
如果你觉得这种修改方式麻烦, 还有一种界面修改方法
我们在项目上右键 --> 属性 --> 调试, 就能看到对应的配置了, 如图:
当前是自托管模式, 我修改为cus100, 这里显示的就是cus100, 点击上面的配置文件, 还可以修改不同的托管模式的配置:
这里就不做演示了, 修改效果和直接修改launchsettings.json文件是一样的
ps: 我们已经把两种托管模式的环境都设置为了默认的development, 开发环境.
上面已经讲完了环境的配置和切换, 下面讲讲根据不同的环境, 自动读取不同的配置文件, 我们先修改一下代码, 让输入的文件是从appsettings.json配置里面读取的, 修改后的startup类代码如下:
using microsoft.aspnetcore.builder; using microsoft.aspnetcore.hosting; using microsoft.aspnetcore.http; using microsoft.extensions.configuration; using microsoft.extensions.dependencyinjection; using system.text; namespace unit1 { public class startup { private readonly iconfiguration _configuration; /// <summary> /// /// </summary> /// <param name="configuration">注入或者配置文件的接口对象</param> public startup(iconfiguration configuration) { this._configuration = configuration; } // this method gets called by the runtime. use this method to add services to the container. // for more information on how to configure your application, visit https://go.microsoft.com/fwlink/?linkid=398940 public void configureservices(iservicecollection services) { } // this method gets called by the runtime. use this method to configure the http request pipeline. public void configure(iapplicationbuilder app, ihostingenvironment env) { if (env.isdevelopment()) { app.usedeveloperexceptionpage(); } //env.environmentname = "cus1"; //设置自定义环境名称 app.run(async (context) => { context.response.contenttype = "text/plain;charset=utf-8"; //防止writeasync方法输出中文乱码 var msg = this._configuration.getvalue<string>("hello"); await context.response.writeasync(msg, encoding.utf8); /*if (env.isdevelopment()) { await context.response.writeasync("开发环境", encoding.utf8); } else if (env.isproduction()) { await context.response.writeasync("运营环境", encoding.utf8); } else if (env.isstaging()) { await context.response.writeasync("预发布环境", encoding.utf8); } else { if (env.isenvironment("cus")) { await context.response.writeasync("自定义环境: cus", encoding.utf8); } else if (env.isenvironment("cus1")) { await context.response.writeasync("自定义环境: cus1", encoding.utf8); } else { await context.response.writeasync($"自定义环境: {env.environmentname}", encoding.utf8); } }*/ }); } } }
然后我们在appsettings.json配置中, 新增一行:"hello": "appsettings.json", 如图:
f5执行, 浏览器输出了appsettings.json, 没问题
然后我们点一下appsettings.json文件前面的箭头, 会发现里面还有个appsettings.development.json文件, 如图:
打开appsettings.development.json文件, 在里面和配置appsettings.json一样, 添加个hello配置, 把值设置为appsettings.development.json, 如图:
然后再f5运行, 浏览器输出的就是appsettings.development.json啦~, 这里的原因, 前面章节已经讲过, 这里不再称述.
我们新建个appsettings.cus.json文件, 然后在里面加个hello配置, 值为appsettings.cus.json, 如图:
然后再修改运行环境为cus, 修改方法参考上面, 然后f5运行, 浏览器就输出appsettings.cus.json啦~
到这里, 这一节就结束了, 到目前为止, 我们对.net core mvc的环境和配置文件切换, 有了一个比较熟悉的了解了, 可以实际运用一下了, 再也不用担心不同环境不同的配置搞混了
本节代码:下载
到此这篇关于asp.net core mvc基础系列之环境设置的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 设计模式:状态模式
下一篇: C#基于WebSocket实现聊天室功能
推荐阅读
-
你所不知道的ASP.NET Core MVC/WebApi基础系列 (一)
-
ASP.NET Core MVC/WebApi基础系列1
-
你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)
-
ASP.NET Core MVC基础学习之局部视图(Partial Views)
-
ASP.Net Core MVC基础系列之中间件
-
ASP.Net Core MVC基础系列之环境设置
-
你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)
-
ASP.NET Core MVC基础学习之局部视图(Partial Views)
-
ASP.Net Core MVC基础系列之获取配置信息
-
ASP.Net Core MVC基础系列之服务注册和管道