asp.net core 系列 9 环境(Development、Staging 、Production)
一.在asp.net core中使用多个环境
asp.net core 配置是基于运行时环境, 使用环境变量。asp.net core 在应用启动时读取环境变量aspnetcore_environment,并将该值存储在 ihostingenvironment.environmentname 中。aspnetcore_environment 可设置为任意值,但框架支持三个值:development、staging 和 production。 如果发布项目未设置 aspnetcore_environment,则默认为 production (本机vs中项目properties\launchsettings.json中environmentvariables默认设置的是development,如果禁用environmentvariables,那默认则为production)。
下面是startup. configure中的默认实现,本机默认配置的是development环境。
//如果是development环境 if (env.isdevelopment()) { //当捕获同步和异步系统。管道中的异常实例,并生成html错误响应。 app.usedeveloperexceptionpage(); } else { //如果不是development环境,向管道中添加一个中间件,用于捕获异常、记录异常并进行重置 app.useexceptionhandler("/home/error"); app.usehsts(); }
1.1 development 模式
开发环境可以启用不应该在生产中公开的功能, 例如asp.net core 模板在开发环境中启用了开发人员异常页(app.usedeveloperexceptionpage())。当出现异常时,显示错误页信息如下图所示:
本地计算机开发环境可以在项目的 properties\launchsettings.json 文件中设置。 在 launchsettings.json 中设置的环境值替代在系统环境中设置的值。新建的mvc项目默认配置如下:
{ "iissettings": { "windowsauthentication": false, "anonymousauthentication": true, "iisexpress": { "applicationurl": "http://localhost:30081", "sslport": 44349 } }, "profiles": { "iis express": { "commandname": "iisexpress", "launchbrowser": true, "environmentvariables": { "aspnetcore_environment": "development" } }, "mynetcorestudy_mvc": { "commandname": "project", "launchbrowser": true, "applicationurl": "https://localhost:5001;http://localhost:5000", "environmentvariables": { "aspnetcore_environment": "development" } } } }
launchsettings.json 中的 applicationurl 属性可指定服务器 url 的列表。 在列表中的 url 之间使用分号。注意:launchsettings.json只用于本机在vs 中开发使用,在开发中可以选择三种之中任意一种的环境模式。当项目发布后,发布后(iis做反向代理),发布的文件中并不会有launchsettings.json文件。
如果不用vs来启动应用程序,使用 dotnet run 命令来 启动应用程序时,使用具有 "commandname": "project" 的第一个配置文件。 commandname 的值指定要启动的 web 服务器。 commandname 可为以下任一项:iis express、iis、project(启动 kestrel 的项目)。
当使用dotnet run 启动应用时:1会读取 launchsettings.json中的environmentvariables;2是会显示打印出host 环境。
1.2 production 模式
production 环境应配置为最大限度地提高安全性、性能和应用可靠性。 不同于开发环境的一些通用设置包括:
(1) 缓存
(2) 客户端资源被捆绑和缩小,并可能从 cdn (网络分发)提供。
(3) 已禁用诊断错误页。
(4) 已启用友好错误页。
(5) 已启用生产记录和监视。
二. 环境设置
在项目中为测试设置特定环境通常很有用。 如果未设置环境,默认值为 production
,这会禁用大多数调试功能。设置环境的方法取决于操作系统。例如将asp.net core razor项目发布后,部署到iis上,访问otherpages/page1时出现异常。此时默认是production
环境变量,会
显示了error页面信息, 表示已启用友好错误页。如下图所示 :
2.1 修改环境变量
上面讲到,设置环境的方法取决于操作系统:有azure 应用服务、windows、macos、linux等。每种操作系统上设置环境变量的方法不同,这里不在介绍,具体参考文档。这里就先只介绍在windows操作系统上以iis做反向代理的配置环境变量。
在windows操作系统上配置环境变量方法有很多。当发布后,文件中有一个web.config。这里就介绍下在web.config中设置 aspnetcore_environment
环境变量。使用 web.config 设置 aspnetcore_environment
环境变量后,它的值会替代系统级设置。
<aspnetcore processpath="dotnet" arguments=".\mynetcorestudy.dll" stdoutlogenabled="false" stdoutlogfile=".\logs\stdout" hostingmodel="inprocess"> <environmentvariables> <environmentvariable name="aspnetcore_environment" value="development" /> </environmentvariables> </aspnetcore>
此时iis上该项目就是development开发环境了,再次访问otherpages/page1时出现异常,此时会捕获同步和异步系统。管道中的异常实例,并生成html错误响应。详细异常信息如下图所示:
三. 发布到iis上步骤
下面简单讲下发布到iis上的步骤实现:
(1) 安装好iis,网上很多参考资料。
(2)下载dotnet-hosting-2.2.1-win.exe 用于在iis上处理对web服务器的请求。下载地址介绍:
在里面找到“当前 .net core 托管捆绑包安装程序(直接下载)”这里进去可以下载到当前版本(aspnetcore-2.2),安装后,在iis模块中能看到aspnetcoremodulev2。对应发布项目中web.config的<handlers>处理。
<handlers> <add name="aspnetcore" path="*" verb="*" modules="aspnetcoremodulev2" resourcetype="unspecified" /> </handlers>
(3) 在vs中右击项目发布,选择"iis ftp" 点击发布。 选择“文件系统”, 目标位置可以选择当前电脑位置如: d:\donetcorestudy\iis
(4) 在iis这边,添加网站
(5) 在应用程序池中对项目(mynetcorestudy) 选择无托管代码。
这样发布到iis上就成功了。
四. 基于环境的 startup 类
最后在讲下startup 类约定。当 asp.net core 应用启动时,会启动startup类。 应用程序可以为不同的环境,单独定义 startup 类。可以定义例如: startupdevelopment类、startupproduction类,startup类。当程序运行时会选择相应的 startup 类。 程序会优先考虑名称后缀与当前环境相匹配的类。如果是developmen环境则程序进入startupdevelopment类,如果是production环境则程序进入startupproduction类。如果找不到匹配的 startup{environmentname},就会使用 startup 类。
基于环境的 startup 类实现代码如下:
public class startupdevelopment { public void configureservices(iservicecollection services) { // ... } public void configure(iapplicationbuilder app, ihostingenvironment env) { // ... } } // startup class to use in the production environment public class startupproduction { public void configureservices(iservicecollection services) { //... } public void configure(iapplicationbuilder app, ihostingenvironment env) { // ... } } // fallback startup class // selected if the environment doesn't match a startup{environmentname} class public class startup { public void configureservices(iservicecollection services) { //... } public void configure(iapplicationbuilder app, ihostingenvironment env) { //... } }
/// <summary> /// 根据环境变量,动态加载startup的程序集类 /// </summary> /// <param name="args"></param> /// <returns></returns> public static iwebhostbuilder createwebhostbuilder(string[] args) { var assemblyname = typeof(startup).gettypeinfo().assembly.fullname; return webhost.createdefaultbuilder(args) .usestartup(assemblyname); }
参考文献
官方资料:
上一篇: 浅谈mysql的查询过程