次の方法で共有


ASP.NET Core Blazor 環境

これは、この記事の最新バージョンではありません。 現在のリリースについては、 この記事の .NET 10 バージョンを参照してください。

警告

このバージョンの 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のクライアントでは、開発者が操作しない HTML コメントを使用して、サーバーから環境が決定されます。

<!--Blazor-WebAssembly:{"environmentName":"Development", ...}-->

スタンドアロン Blazor WebAssembly アプリの場合は、アプリのプロジェクト ファイル (<WasmApplicationEnvironmentName>) で .csproj MSBuild プロパティを使用して環境を設定します。 次の例では、 Staging 環境を設定します。

<WasmApplicationEnvironmentName>Staging</WasmApplicationEnvironmentName>

既定の環境は、ビルド用が Development で、発行用が Production です。

ビルド/発行操作中にスタンドアロン Blazor WebAssembly アプリで環境を設定する方法と、クライアントで起動または実行するアプリの 1 つの方法があります。

  • dotnet buildまたはdotnet publishの実行時にプロパティ値を設定します。 次の例では、アプリの発行時に環境を Staging に設定します。

    dotnet publish -p:WasmApplicationEnvironmentName=Staging
    
  • Visual Studio でのアプリの構成に基づいて、ビルド中または発行中にプロパティを設定します。 次のプロパティ グループは、アプリのプロジェクト ファイルまたは任意の発行構成ファイル (.pubxml) で使用できます。 他のビルド構成で使用するプロパティ グループを追加します。

    <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
      <WasmApplicationEnvironmentName>Development</WasmApplicationEnvironmentName>
    </PropertyGroup>
    
    <PropertyGroup Condition="'$(Configuration)' == 'Release'">
      <WasmApplicationEnvironmentName>Production</WasmApplicationEnvironmentName>
    </PropertyGroup>
    
  • この環境は、発行プロファイルの使用に基づいて設定できます。 次の例では、最初の条件は発行プロファイルが使用されていない場合に環境を Development に設定します (プロファイルを使用しないビルド操作と発行操作の両方に適用されます)。2 番目の条件では、発行プロファイルが使用されたときに環境を Production に設定します。

    <PropertyGroup Condition="'$(PublishProfile)' == ''">
      <WasmApplicationEnvironmentName>Development</WasmApplicationEnvironmentName>
    </PropertyGroup>
    
    <PropertyGroup Condition="'$(PublishProfile)' != ''">
      <WasmApplicationEnvironmentName>Production</WasmApplicationEnvironmentName>
    </PropertyGroup>
    
  • カスタム サーバー側 Web API エンドポイントを作成します。 スタンドアロン Blazor WebAssembly アプリは、実行中にアプリの起動時またはオンデマンドで Web API から環境を要求します。 値は、 WebAssemblyStartOptions または withApplicationEnvironmentで渡す必要があります。

    通常、.NET 参照ソースへのドキュメント リンクを使用すると、リポジトリの既定のブランチが読み込まれます。このブランチは、.NET の次回リリースに向けて行われている現在の開発を表します。 特定のリリースのタグを選択するには、[Switch branches or tags](ブランチまたはタグの切り替え) ドロップダウン リストを使います。 詳細については、「ASP.NET Core ソース コードのバージョン タグを選択する方法」 (dotnet/AspNetCore.Docs #26205) を参照してください。

Blazor Web Appのクライアントでは、環境は、Blazor-Environmentという名前のヘッダーを介してブラウザーに環境を通信するミドルウェアを介してサーバーから決定されます。 ヘッダーは、クライアント側のWebAssemblyHost ファイル (Program) にWebAssemblyHostBuilder.CreateDefaultが作成されるときに環境を設定します。

ローカルで実行されているスタンドアロン Blazor WebAssembly アプリの場合、開発サーバーは、ホスティング環境から取得した環境名を持つ Blazor-Environment ヘッダーを追加します。 ホスティング環境は、プロジェクトのASPNETCORE_ENVIRONMENT ファイルによって確立されたProperties/launchSettings.json環境変数から環境を設定します。 Blazor WebAssembly プロジェクト テンプレートから作成されたプロジェクトの環境変数の既定値はDevelopment。 詳細については、「 ヘッダーを使用してクライアント側環境を設定する 」セクションを参照してください。

ホスト Blazor WebAssembly アプリのクライアントでは、環境は、 Blazor-Environmentという名前のヘッダーを介してブラウザーに環境を通信するミドルウェアを介してサーバーから決定されます。 ヘッダーは、クライアント側のWebAssemblyHost ファイル (Program) にWebAssemblyHostBuilder.CreateDefaultが作成されるときに環境を設定します。

ローカルで実行されているスタンドアロン Blazor WebAssembly アプリの場合、開発サーバーは、ホスティング環境から取得した環境名を持つ Blazor-Environment ヘッダーを追加します。 ホスティング環境は、プロジェクトのASPNETCORE_ENVIRONMENT ファイルによって確立されたProperties/launchSettings.json環境変数から環境を設定します。 Blazor WebAssembly プロジェクト テンプレートから作成されたプロジェクトの環境変数の既定値はDevelopment。 詳細については、「 ヘッダーを使用してクライアント側環境を設定する 」セクションを参照してください。

開発中にアプリがローカルで実行されている場合、アプリは既定で Development 環境に設定されます。 アプリを発行すると、既定で環境が Productionされます。

ASP.NET Core アプリの構成に関する一般的なガイダンスについては、「 ASP.NET Core ランタイム環境」を参照してください。 開発およびテスト中の Development 環境以外の環境 ( Staging など) での静的ファイルを使用したサーバー側アプリ構成については、 ASP.NET Core の静的ファイルを参照してください。

スタートアップ構成を使用してクライアント側環境 Blazor 設定する

次の例では、ホスト名にBlazorが含まれている場合、Staging環境でlocalhostを開始します。 それ以外の場合、環境は既定値に設定されます。

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 Web App構成で webAssembly>environment プロパティを設定するBlazor.startの場合は、サーバー側環境を 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 アプリまたは.ClientのBlazor Web App プロジェクトのいずれかで環境をコンソールに記録するには、ProgramWebAssemblyHostが作成された後、プロジェクトをビルドして実行する行の前に次の C# コードをWebAssemblyHostBuilder.CreateDefault ファイルに配置します (await builder.Build().RunAsync();)。

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の組み込み開発サーバーを使用してローカル開発を実行する場合は、プロジェクトのBlazor-Environment ファイルでASPNETCORE_ENVIRONMENT環境変数の値を設定することで、Properties/launchSettings.json ヘッダーの値を制御できます。 開発サーバーでローカルに実行する場合、アプリの環境を決定するための優先順位は、Blazor.start応答ヘッダー (environment ファイル) >環境変数 (Blazor-Environment) blazor.boot.jsonです。 デプロイされたASPNETCORE_ENVIRONMENT アプリには、launchSettings.json環境変数 (Blazor WebAssembly) アプローチを使用することはできません。 この手法は、アプリのローカル実行時に開発サーバーでのみ機能します。

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>

アプリが web.config フォルダーに発行されたときに上書きされない IIS 用のカスタム publish ファイルを使用するには、「IIS で Core Blazor WebAssemblyASP.NET ホストして展開する」を参照してください。

Nginx

Nginx サーバーの場合は、add_headerngx_http_headers_module ディレクティブを使用します。

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

詳細については、次のリソースを参照してください。

Apache

Apache サーバーの場合は、Header モジュールの mod_headers ディレクティブを使用します。

<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 portal で、 ASPNETCORE_ENVIRONMENT アプリ設定を使用して環境を設定します。 BlazorAzureAppSampleという名前のアプリの場合、ステージング App Service スロットには BlazorAzureAppSample/Staging という名前が付けられます。 Staging スロットの構成では、ASPNETCORE_ENVIRONMENT のアプリ設定を Staging の値で作成します。 デプロイ スロットの設定 は、この設定に対して有効になっています。

ブラウザーで要求されると、BlazorAzureAppSample/Staging アプリはStaginghttps://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 サービスがないため、サーバーのプリレンダリング中にサービスを挿入し、サービス実装のホスト環境拡張メソッドとプロパティを使用することはできません。 対話型 WebAssembly または対話型自動コンポーネントにサービスを挿入すると、次のランタイム エラーが発生します。

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

これに対処するには、サーバー上の IWebAssemblyHostEnvironment 用のカスタム サービス実装を作成します。 詳細と実装例については、prerendering に関する記事の「サーバー上のカスタム サービスの実装」セクションを参照してください。これは、Blazorドキュメントの後半で説明します。

起動時にクライアント側環境を読み取る

起動時に、WebAssemblyHostBuilderIWebAssemblyHostEnvironment プロパティを介してHostEnvironmentを公開します。これにより、ホスト ビルダー コードで環境固有のロジックが有効になります。

Program ファイルで次の操作を行います。

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

WebAssemblyHostEnvironmentExtensionsによって提供される次の便利な拡張メソッドでは、現在の環境でDevelopmentProductionStaging、カスタム環境の名前を確認できます。

Program ファイルで次の操作を行います。

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

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

IWebAssemblyHostEnvironment.BaseAddress プロパティは、NavigationManager サービスが使用できない場合に起動時に使用できます。

その他のリソース