共用方式為


ASP.NET Core Blazor 環境

注意

這不是本文的最新版本。 如需目前版本,請參閱本文的 .NET 9 版本

警告

不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支援原則。 如需目前版本,請參閱本文的 .NET 9 版本

重要

這項資訊與發行前版本產品有關,在正式發行前可能會大幅修改。 Microsoft未就此處提供的資訊提供任何明示或默示擔保。

如需目前版本,請參閱本文的 .NET 9 版本

本文說明如何在 Blazor 應用程式中設定和讀取 環境

在本機執行應用程式時,環境預設為 Development。 發佈應用程式時,環境預設為 Production

我們建議使用下列慣例:

  • 總是使用「Development」環境名稱進行本機開發。 這是因為在設定應用程式和其本機開發執行工具時,ASP.NET Core 架構要求使用確切的名稱。

  • 針對測試、預備和生產環境,請一律發佈及部署應用程式。 您可以使用任何您想要用於已發佈的應用程式的環境命名方案,但必須一律使用應用程式設定檔案名稱,其中環境區段的大小寫必須完全符合環境名稱。 針對暫存環境,請使用「Staging」 (大寫「S」)作為環境名稱,並將應用程式設定檔命名為符合(appsettings.Staging.json)。 針對生產環境,請使用 "Production"(大寫 "P")作為環境名稱,並將應用程式設定檔命名為符合 "appsettings.Production.json"。

設定環境

環境是使用下列任何一種方法來設定:

在 Blazor Web App的客戶端上,環境是由伺服器透過中介軟體決定的,這個中介軟體透過名為 Blazor-Environment的標頭與瀏覽器進行通訊。 在用戶端 Program 檔案中建立 WebAssemblyHost 時,標頭會設定環境(WebAssemblyHostBuilder.CreateDefault)。

環境可以使用以下任一方法來設定:

在用於 Blazor Web App 的用戶端或託管 Blazor WebAssembly 應用程式的用戶端上,環境是透過伺服器上的中間件被決定,並透過名為 Blazor-Environment的標頭將環境傳送至瀏覽器。 當在用戶端 Program 檔案中建立 WebAssemblyHost 時,標頭會設定環境(WebAssemblyHostBuilder.CreateDefault)。

針對在本機執行的獨立 Blazor WebAssembly 應用程式,開發伺服器會新增 Blazor-Environment 標頭,其中包含從裝載環境取得的環境名稱。 裝載環境會從專案的 Properties/launchSettings.json 檔案所建立的 ASPNETCORE_ENVIRONMENT 環境變數中設定環境。 從 Blazor WebAssembly 項目樣本建立之項目中環境變數的預設值為 Development。 如需進一步資訊,請參閱「透過標頭設定用戶端環境」的部分。

針對在開發中本機執行的應用程式,應用程式預設為 Development 環境。 發佈應用程式會將環境預設為 Production

如需 ASP.NET Core 應用程式設定的一般指引,請參閱 在 ASP.NET Core中使用多個環境。 如需在開發和測試期間,在 Development 環境以外的環境中具有靜態檔案的伺服器端應用程式組態(例如,Staging),請參閱 ASP.NET Core Blazor 靜態檔案

透過 Blazor 啟動組態設定客戶端環境

如果主機名包含 localhost,下列範例會在 Staging 環境中啟動 Blazor。 否則,環境會設定為其預設值。

Blazor Web App:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  if (window.location.hostname.includes("localhost")) {
    Blazor.start({
      webAssembly: {
        environment: "Staging"
      }
    });
  } else {
    Blazor.start();
  }
</script>

在上述範例中,{BLAZOR SCRIPT} 佔位元是 Blazor 腳本路徑和檔名。 如需腳本的位置,請參閱 ASP.NET Core Blazor 專案結構

注意

針對在 Blazor.start 設定中配置 webAssembly>environment 屬性的 Blazor Web App,最理想的做法是將伺服器端的環境與在 environment 屬性上設定的環境相匹配。 否則,伺服器上的預渲染將在與用戶端渲染不同的環境下運行,這可能導致意想不到的效果。 如需設定 Blazor Web App環境的一般指引,請參閱 在 ASP.NET Core中使用多個環境。

獨立 Blazor WebAssembly:

<script src="{BLAZOR SCRIPT}" autostart="false"></script>
<script>
  if (window.location.hostname.includes("localhost")) {
    Blazor.start({
      environment: "Staging"
    });
  } else {
    Blazor.start();
  }
</script>

在上述範例中,{BLAZOR SCRIPT} 佔位元是 Blazor 腳本路徑和檔名。 如需腳本的位置,請參閱 ASP.NET Core Blazor 專案結構

使用 environment 屬性會覆寫 Blazor-Environment 標頭所設定的環境。

上述方法會設定客戶端的環境,而不變更 Blazor-Environment 標頭的值,也不會變更伺服器專案中記錄啟動環境的控制台記錄設定,對於已經採用全域 Interactive WebAssembly 渲染的 Blazor Web App。

若要在獨立 Blazor WebAssembly 專案或 Blazor Web App的 .Client 專案中將環境記錄到主控台,請在使用 WebAssemblyHostBuilder.CreateDefault 建立 WebAssemblyHost 之後,於建置並執行專案的行 (await builder.Build().RunAsync();) 之前,將下列 C# 程式碼放入 Program 檔案中。

Console.WriteLine(
    $"Client Hosting Environment: {builder.HostEnvironment.Environment}");

如需有關 Blazor 啟動的詳細資訊,請參閱 ASP.NET Core Blazor 啟動

透過標頭設定客戶端環境

Blazor WebAssembly 應用程式可以使用 Blazor-Environment 標頭來設定環境。 具體來說,必須在 _framework/blazor.boot.json 檔案上設置回應標頭,但在其他 Blazor 檔案請求或整個 Blazor 部署的檔案伺服器回應中設置這些標頭並不會造成任何問題。

雖然 Blazor 架構在連字號串燒式大小寫中發出標頭名稱與混合字母大小寫(Blazor-Environment),但歡迎使用全小寫或全大寫的連字號串燒式大小寫(blazor-environmentBLAZOR-ENVIRONMENT)。

使用 Blazor的內建開發伺服器進行本機開發時,您可以在專案的 Properties/launchSettings.json 檔案中設定 ASPNETCORE_ENVIRONMENT 環境變數的值,以控制 Blazor-Environment 標頭的值。 使用開發伺服器在本機執行時,判斷應用程式環境的優先順序是 Blazor.start 組態(environment 索引鍵)>Blazor-Environment 回應標頭(blazor.boot.json 檔案)>ASPNETCORE_ENVIRONMENT 環境變數(launchSettings.json)。 您無法針對已部署 Blazor WebAssembly 應用程式使用 ASPNETCORE_ENVIRONMENT 環境變數 (launchSettings.json) 方法。 這項技術只適用於在本地運行應用程式時的開發伺服器。

IIS

在下列 IIS 範例中,自定義標頭 (Blazor-Environment) 會新增至已發佈的 web.config 檔案。 web.config 檔案位於 bin/Release/{TARGET FRAMEWORK}/publish 資料夾中,其中 {TARGET FRAMEWORK} 占位元符是目標架構:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    ...
    <httpProtocol>
      <customHeaders>
        <add name="Blazor-Environment" value="Staging" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

注意

若要使用不會在應用程式發佈至 publish 資料夾時被覆寫的自訂 IIS web.config 檔案,請參閱 託管和部署 ASP.NET Core Blazor WebAssembly

Nginx

針對 Nginx 伺服器,請使用來自 ngx_http_headers_moduleadd_header 指令:

http {
    server {
        ...
        location / {
            ...
            add_header Blazor-Environment "Staging";
        }
    }
}

如需詳細資訊,請參閱下列資源:

Apache

針對 Apache 伺服器,請使用來自 mod_headers 模組的 Header 指示詞:

<VirtualHost *:80>
    ...
    Header set Blazor-Environment "Staging"
    ...
</VirtualHost>

如需詳細資訊:

設定 Azure App Service 的環境

針對獨立 Blazor WebAssembly 應用程式,您可以透過 啟動組態Blazor-Environment 標頭手動設定環境。

針對伺服器端應用程式,透過 Azure 中的 ASPNETCORE_ENVIRONMENT 應用程式設定來設定環境:

  1. 確認應用程式設定檔名中的環境區段大小寫完全符合其環境名稱大小寫。 例如,Staging 環境的相符應用程式設定檔名稱 appsettings.Staging.json。 如果檔名是 appsettings.staging.json(小寫 “s”),則檔案未找到,而且檔案中的設定不會用於 Staging 環境中。

  2. 針對 Visual Studio 部署,確認應用程式已部署到正確的部署位置。 針對名為 BlazorAzureAppSample的應用程式,應用程式會部署到 Staging 部署位置。

  3. 在環境部署位置的 Azure 入口網站中,使用 ASPNETCORE_ENVIRONMENT 應用程式設定來設定環境。 針對名為 BlazorAzureAppSample的應用程式,暫存 App Service 插槽會命名為 BlazorAzureAppSample/Staging。 針對 Staging 槽的組態,為 ASPNETCORE_ENVIRONMENT 建立一個應用程式設定,並將其值設定為 Staging部署時段設定 已針對該設定啟用。

當在瀏覽器中請求時,BlazorAzureAppSample/Staging 應用程式會在 Staging 環境中載入於 https://blazorazureappsample-staging.azurewebsites.net

在瀏覽器中載入應用程式時,blazor.boot.json 的回應標頭集合顯示,Blazor-Environment 的標頭值是 Staging

應用程式會載入來自 appsettings.{ENVIRONMENT}.json 檔案的應用程式設定,其中 {ENVIRONMENT} 占位元是應用程式的環境。 在上述範例中,會載入來自 appsettings.Staging.json 檔案的設定。

在 Blazor WebAssembly 應用程式中讀取環境

藉由插入 IWebAssemblyHostEnvironment 並讀取 Environment 屬性,以取得元件中的應用程式環境。

ReadEnvironment.razor

@page "/read-environment"
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env

<h1>Environment example</h1>

<p>Environment: @Env.Environment</p>

在 Blazor Web App 中從用戶端側讀取環境

假設元件或應用程式未停用預先設計,則 .Client 專案中的元件會在伺服器上預先呈現。 因為伺服器沒有已註冊的 IWebAssemblyHostEnvironment 服務,所以無法在伺服器預先呈現期間插入服務,並使用服務實作的主機環境擴充方法和屬性。 將服務插入 Interactive WebAssembly 或 Interactive Auto 元件會導致下列運行時間錯誤:

There is no registered service of type 'Microsoft.AspNetCore.Components.WebAssembly.Hosting.IWebAssemblyHostEnvironment'.

若要解決此問題,請在伺服器上建立 IWebAssemblyHostEnvironment 的自定義服務實作。 將下列類別新增至伺服器專案。

ServerHostEnvironment.cs

using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.AspNetCore.Components;

public class ServerHostEnvironment(IWebHostEnvironment env, NavigationManager nav) : 
    IWebAssemblyHostEnvironment
{
    public string Environment => env.EnvironmentName;
    public string BaseAddress => nav.BaseUri;
}

在伺服器專案的 Program 檔案中,註冊服務:

builder.Services.TryAddScoped<IWebAssemblyHostEnvironment, ServerHostEnvironment>();

此時,IWebAssemblyHostEnvironment 服務可以插入到互動式 WebAssembly 或互動式 Auto 元件中,如 在 Blazor WebAssembly 應用程式 區段中所示的環境中使用。

上述範例可以示範可能有不同於用戶端環境的伺服器環境,但不建議這麼做,而且可能會導致任意結果。 在 Blazor Web App中設定環境時,最好比對伺服器和 .Client 專案環境。 在測試應用程式中考慮下列案例:

  • 透過 Blazor.start,使用 Staging 環境實作用戶端 (webassembly) 環境屬性。 如需範例,請參閱 透過啟動組態 設定客戶端環境一節。
  • 請勿變更伺服器端 Properties/launchSettings.json 檔案。 將 environmentVariables 區段保留 ASPNETCORE_ENVIRONMENT 環境變數設定為 Development

您可以在 UI 中看到 IWebAssemblyHostEnvironment.Environment 屬性變更的值。

當在伺服器上發生預渲染時,元件會在 Development 環境中渲染:

Environment: Development

當元件在重新渲染一兩秒後,Blazor 套件組合下載完成並且 .NET WebAssembly 執行時期啟動,這些值會改變,反映出客戶端正在 Staging 環境中運作:

Environment: Staging

上述範例示範為何建議將伺服器環境設定為符合開發、測試和生產環境部署的客戶端環境。

如需詳細資訊,請參閱 用戶端服務無法在預呈現過程中解決的 一節,該節位於 轉譯模式 文章中,此文章稍後在 Blazor 檔案中出現。

在啟動期間讀取客戶端環境

在啟動期間,WebAssemblyHostBuilder 會透過 HostEnvironment 屬性公開 IWebAssemblyHostEnvironment,以啟用主機產生器程式代碼中的環境特定邏輯。

Program 檔案中:

if (builder.HostEnvironment.Environment == "Custom")
{
    ...
};

透過 WebAssemblyHostEnvironmentExtensions 提供的下列便利擴充方法,可以檢查目前環境是否包含 DevelopmentProductionStaging和自定義環境名稱:

Program 檔案中:

if (builder.HostEnvironment.IsStaging())
{
    ...
};

if (builder.HostEnvironment.IsEnvironment("Custom"))
{
    ...
};

NavigationManager 服務無法使用時,可以在啟動期間使用 IWebAssemblyHostEnvironment.BaseAddress 屬性。

其他資源