ASP.NET Core Blazor 環境
注意
這不是本文的最新版本。 如需目前版本,請參閱本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支援原則。 如需目前版本,請參閱本文的 .NET 9 版本。
本文說明如何在 Blazor 應用程式中設定和讀取 環境。
在本機執行應用程式時,環境預設為 Development
。 發佈應用程式時,環境預設為 Production
。
我們建議使用下列慣例:
總是使用「
Development
」環境名稱進行本機開發。 這是因為在設定應用程式和其本機開發執行工具時,ASP.NET Core 架構要求使用確切的名稱。針對測試、預備和生產環境,請一律發佈及部署應用程式。 您可以使用任何您想要用於已發佈的應用程式的環境命名方案,但必須一律使用應用程式設定檔案名稱,其中環境區段的大小寫必須完全符合環境名稱。 針對暫存環境,請使用「
Staging
」 (大寫「S」)作為環境名稱,並將應用程式設定檔命名為符合(appsettings.Staging.json
)。 針對生產環境,請使用 "Production
"(大寫 "P")作為環境名稱,並將應用程式設定檔命名為符合 "appsettings.Production.json
"。
設定環境
環境是使用下列任何一種方法來設定:
- Blazor Web App:對於一般 ASP.NET Core 應用程式,使用在 使用多個環境的 ASP.NET Core 所描述的任一方法。
- Blazor Web App 或獨立 Blazor WebAssembly:Blazor 啟動組態
- 獨立 Blazor WebAssembly:
Blazor-Environment
標頭 - Blazor Web App 或獨立 Blazor WebAssembly:Azure App Service
在 Blazor Web App的客戶端上,環境是由伺服器透過中介軟體決定的,這個中介軟體透過名為 Blazor-Environment
的標頭與瀏覽器進行通訊。 在用戶端 Program
檔案中建立 WebAssemblyHost 時,標頭會設定環境(WebAssemblyHostBuilder.CreateDefault)。
環境可以使用以下任一方法來設定:
- Blazor Server:針對一般 ASP.NET Core 應用程式,使用 中 ASP.NET Core 的多環境方法中所描述的任一方法。
- Blazor Server 或 Blazor WebAssembly:Blazor 啟動設定
-
Blazor WebAssembly:
Blazor-Environment
標題 - Blazor Server 或 Blazor WebAssembly:Azure App Service
在用於 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-environment
,BLAZOR-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_module
的 add_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
應用程式設定來設定環境:
確認應用程式設定檔名中的環境區段大小寫完全符合其環境名稱大小寫。 例如,
Staging
環境的相符應用程式設定檔名稱appsettings.Staging.json
。 如果檔名是appsettings.staging.json
(小寫 “s
”),則檔案未找到,而且檔案中的設定不會用於Staging
環境中。針對 Visual Studio 部署,確認應用程式已部署到正確的部署位置。 針對名為
BlazorAzureAppSample
的應用程式,應用程式會部署到Staging
部署位置。在環境部署位置的 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 提供的下列便利擴充方法,可以檢查目前環境是否包含 Development
、Production
、Staging
和自定義環境名稱:
在 Program
檔案中:
if (builder.HostEnvironment.IsStaging())
{
...
};
if (builder.HostEnvironment.IsEnvironment("Custom"))
{
...
};
NavigationManager 服務無法使用時,可以在啟動期間使用 IWebAssemblyHostEnvironment.BaseAddress 屬性。