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)。web

  下面是Startup. Configure中的默認實現,本機默認配置的是Development環境。json

//若是是Development環境
            if (env.IsDevelopment())
            {
                //當捕獲同步和異步系統。管道中的異常實例,並生成HTML錯誤響應。
                app.UseDeveloperExceptionPage();
            }
            else
            {
                //若是不是Development環境,向管道中添加一箇中間件,用於捕獲異常、記錄異常並進行重置
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
 1.1 Development 模式

   開發環境能夠啓用不該該在生產中公開的功能, 例如ASP.NET Core 模板在開發環境中啓用了開發人員異常頁(app.UseDeveloperExceptionPage())。當出現異常時,顯示錯誤頁信息以下圖所示:windows

  本地計算機開發環境能夠在項目的 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 環境應配置爲最大限度地提升安全性、性能和應用可靠性。 不一樣於開發環境的一些通用設置包括:mvc

    (1) 緩存app

    (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服務器的請求。下載地址介紹:

      https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/index?view=aspnetcore-2.2#install-the-net-core-hosting-bundle

      在裏面找到「當前 .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);
        }

參考文獻

官方資料:asp.net core 環境

相關文章
相關標籤/搜索