次の方法で共有


アプリを構成する

ヒント

このコンテンツは電子ブック、Azure の「ASP.NET Web Forms 開発者向け Blazor」からの抜粋です。これは .NET Docs から閲覧するか、オフラインで読める無料ダウンロードの PDF としても入手できます。

Blazor-for-ASP-NET-Web-Forms-Developers 電子ブックのカバー サムネイル。

Web フォームでアプリ構成を読み込む主な方法は、サーバー上の web.config ファイル内のエントリ、または web.configによって参照される関連する構成ファイルです。静的 ConfigurationManager オブジェクトを使用して、アプリ設定、データ リポジトリ接続文字列、およびアプリに追加されるその他の拡張構成プロバイダーを操作できます。 次のコードに示すように、アプリ構成との対話を確認するのが一般的です。

var configurationValue = ConfigurationManager.AppSettings["ConfigurationSettingName"];
var connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseConnectionName"].ConnectionString;

ASP.NET Core とサーバー側の Blazorでは、アプリが Windows IIS サーバーでホストされている場合、 web.config ファイルが存在する可能性があります。 ただし、この構成との対話 ConfigurationManager はなく、他のソースからより構造化されたアプリ構成を受け取ることができます。 構成の収集方法と、 web.configファイルから 構成情報に引き続きアクセスする方法を見てみましょう。

設定情報源

ASP.NET Core では、アプリに使用できる構成ソースが多数あることが認識されます。 フレームワークは、既定でこれらの機能のベストを提供しようとします。 構成は、ASP.NET Core によってこれらのさまざまなソースから読み取られ、集計されます。 同じ構成キーの後で読み込まれた値が、以前の値よりも優先されます。

ASP.NET Core は、クラウドに対応し、オペレーターと開発者の両方にとってアプリの構成を容易にするように設計されています。 ASP.NET Core は環境に対応しており、 Production または Development 環境で実行されているかどうかを認識します。 環境インジケーターは、 ASPNETCORE_ENVIRONMENT システム環境変数で設定されます。 値が構成されていない場合、アプリは既定で Production 環境で実行されます。

アプリは、環境の名前に基づいて、複数のソースから構成をトリガーして追加できます。 既定では、構成は次のリソースから一覧表示された順序で読み込まれます。

  1. ファイルappsettings.json (存在する場合)
  2. appsettings。{ENVIRONMENT_NAME}.json ファイル (存在する場合)
  3. ディスク上のユーザー シークレット ファイル (存在する場合)
  4. 環境変数
  5. コマンドライン引数

appsettings.json 形式とアクセス

appsettings.json ファイルは、次の JSON のような構造の値を使用して階層化できます。

{
  "section0": {
    "key0": "value",
    "key1": "value"
  },
  "section1": {
    "key0": "value",
    "key1": "value"
  }
}

上記の JSON が表示されると、構成システムは子値をフラット化し、その完全修飾階層パスを参照します。 階層内の各プロパティは、コロン (:) 文字で区切られます。 たとえば、構成キー section1:key0 は、 section1 オブジェクト リテラルの key0 値にアクセスします。

ユーザー シークレット

ユーザー シークレットは次のとおりです。

  • アプリ開発フォルダーの外部にある開発者のワークステーション上の JSON ファイルに格納される構成値。
  • Development環境で実行されている場合にのみ読み込まれます。
  • 特定のアプリに関連付けられています。
  • .NET CLI の user-secrets コマンドを使用して管理します。

user-secrets コマンドを実行して、シークレット ストレージ用にアプリを構成します。

dotnet user-secrets init

上記のコマンドは、プロジェクト ファイルに UserSecretsId 要素を追加します。 この要素には GUID が含まれています。GUID は、シークレットをアプリに関連付けるために使用されます。 その後、 set コマンドを使用してシークレットを定義できます。 例えば次が挙げられます。

dotnet user-secrets set "Parent:ApiKey" "12345"

上記のコマンドを実行すると、 Parent:ApiKey 構成キーが開発者のワークステーションで使用できるようになり、値が 12345

ユーザー シークレットの作成、格納、管理の詳細については、ASP.NET Core ドキュメントの開発中のアプリ シークレットの安全なストレージ に関するページを参照してください。

環境変数

アプリ構成に読み込まれる次の値のセットは、システムの環境変数です。 これで、システムのすべての環境変数設定に構成 API を使用してアクセスできるようになりました。 階層型の値は、アプリ内で読み取るとフラット化され、コロン文字で区切られます。 ただし、一部のオペレーティング システムでは、コロン文字の環境変数名を使用できません。 ASP.NET Core では、二重アンダースコア (__) を持つ値をアクセス時にコロンに変換することで、この制限に対処します。 上記のユーザー シークレット セクションの Parent:ApiKey 値は、環境変数 Parent__ApiKeyでオーバーライドできます。

コマンドライン引数

構成は、アプリの起動時にコマンド ライン引数として指定することもできます。 設定する構成値の名前と構成する値を示すには、二重ダッシュ (--) またはスラッシュ (/) 表記を使用します。 構文は次のコマンドのようになります。

dotnet run CommandLineKey1=value1 --CommandLineKey2=value2 /CommandLineKey3=value3
dotnet run --CommandLineKey1 value1 /CommandLineKey2 value2
dotnet run Parent:ApiKey=67890

web.config が復帰する

アプリを IIS 上の Windows に展開した場合でも、 web.config ファイルはアプリを管理するように IIS を構成します。 既定では、IIS は ASP.NET Core Module (ANCM) への参照を追加します。 ANCM は、Kestrel Web サーバーの代わりにアプリをホストするネイティブ IIS モジュールです。 この web.configセクションは 、次の XML マークアップに似ています。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath=".\MyApp.exe"
                  stdoutLogEnabled="false"
                  stdoutLogFile=".\logs\stdout"
                  hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>

アプリ固有の構成は、environmentVariables要素にaspNetCore要素を入れ子にすることで定義できます。 このセクションで定義されている値は、環境変数として ASP.NET Core アプリに表示されます。 環境変数は、アプリの起動のそのセグメント中に適切に読み込まれます。

<aspNetCore processPath="dotnet"
      arguments=".\MyApp.dll"
      stdoutLogEnabled="false"
      stdoutLogFile=".\logs\stdout"
      hostingModel="inprocess">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
    <environmentVariable name="Parent:ApiKey" value="67890" />
  </environmentVariables>
</aspNetCore>

アプリでの構成の読み取り

ASP.NET Core は、 IConfiguration インターフェイスを介してアプリの構成を提供します。 この構成インターフェイスは、 Blazor コンポーネント、 Blazor ページ、および構成へのアクセスを必要とするその他の ASP.NET Core マネージド クラスによって要求される必要があります。 ASP.NET Core フレームワークは、このインターフェイスに、先ほど構成した解決済みの構成を自動的に設定します。 Blazor ページまたはコンポーネントの Razor マークアップでは、次のようにIConfiguration ファイルの先頭に @inject ディレクティブを含む オブジェクトを挿入できます。

@inject IConfiguration Configuration

この前のステートメントにより、 IConfiguration オブジェクトは、Razor テンプレートの残りの部分で Configuration 変数として使用できるようになります。

インデクサー パラメーターとして求められる構成設定階層を指定することで、個々の構成設定を読み取ることができます。

var mySetting = Configuration["section1:key0"];

構成セクション全体をフェッチするには、 GetSection メソッドを使用して、前の例から section1 の構成を取得する GetSection("section1") のような構文を使用して、特定の場所にあるキーのコレクションを取得します。

厳密に型指定された構成

Web フォームでは、 ConfigurationSection 型と関連付けられた型から継承された厳密に型指定された構成型を作成できます。 ConfigurationSectionを使用すると、これらの構成値に対して一部のビジネス ルールと処理を構成できます。

ASP.NET Core では、構成値を受け取るクラス階層を指定できます。 これらのクラスは次のようなものです。

  • 親クラスから継承する必要はありません。
  • キャプチャする構成構造のプロパティと型参照に一致する public プロパティを含める必要があります。

前の appsettings.json サンプルでは、次のクラスを定義して値をキャプチャできます。

public class MyConfig
{
    public MyConfigSection section0 { get; set;}

    public MyConfigSection section1 { get; set;}
}

public class MyConfigSection
{
    public string key0 { get; set; }

    public string key1 { get; set; }
}

このクラス階層は、Startup.ConfigureServices メソッドに次の行を追加することで設定できます (またはbuilder.Servicesの代わりに services プロパティを使用して、Program.cs内の適切な場所)。

services.Configure<MyConfig>(Configuration);

アプリの残りの部分では、@inject型の Razor テンプレートのクラスまたはIOptions<MyConfig> ディレクティブに入力パラメーターを追加して、厳密に型指定された構成設定を受け取ることができます。 IOptions<MyConfig>.Value プロパティは、構成設定から設定されたMyConfig値を生成します。

@inject IOptions<MyConfig> options
@code {
    var MyConfiguration = options.Value;
    var theSetting = MyConfiguration.section1.key0;
}

オプション機能の詳細については、ASP.NET Core のオプション パターン ドキュメントを参照してください。