当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net core 系列 9 环境(Development、Staging 、Production)

asp.net core 系列 9 环境(Development、Staging 、Production)

2019年01月17日  | 移动技术网IT编程  | 我要评论

中国营销论坛,忻州新闻,奥视纪录片

一.在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);
        }

  

参考文献

官方资料:

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网