欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-08-31 12:45:12
一.在asp.net core中使用多个环境 ASP.NET Core 配置是基于运行时环境, 使用环境变量。ASP.NET Core 在应用启动时读取环境变量ASPNETCORE_ENVIRONMENT,并将该值存储在 IHostingEnvironment.EnvironmentName 中。A ......

一.在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())。当出现异常时,显示错误页信息如下图所示:

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

  本地计算机开发环境可以在项目的 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页面信息, 表示已启用友好错误页。如下图所示 :

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

  

  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错误响应。详细异常信息如下图所示:

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

  

三. 发布到iis上步骤

  下面简单讲下发布到iis上的步骤实现:

    (1) 安装好iis,网上很多参考资料。

    (2)下载dotnet-hosting-2.2.1-win.exe 用于在iis上处理对web服务器的请求。下载地址介绍:

      

      在里面找到“当前 .net core 托管捆绑包安装程序(直接下载)”这里进去可以下载到当前版本(aspnetcore-2.2),安装后,在iis模块中能看到aspnetcoremodulev2。对应发布项目中web.config的<handlers>处理。

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

     <handlers>
        <add name="aspnetcore" path="*" verb="*" modules="aspnetcoremodulev2" resourcetype="unspecified" />
      </handlers>

    (3) 在vs中右击项目发布,选择"iis ftp" 点击发布。 选择“文件系统”, 目标位置可以选择当前电脑位置如: d:\donetcorestudy\iis

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

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

     (4) 在iis这边,添加网站      

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

    (5) 在应用程序池中对项目(mynetcorestudy)  选择无托管代码。

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

     这样发布到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);
        }

  

参考文献

官方资料: