Lightning Blog
Blazor記事イメージ画像

【Blazor】 appsettings.jsonの使い方

更新日:2024/06/12

この記事では、Blazor Serverを例にして、appsettings.jsonの使い方について解説します。 また、開発環境や運用・本番環境により、設定値使い分ける方法についても合わせて解説します。

    目次

  • appsettings.jsonとは?
  • Blazor Serverからappsettings.json読み込み
  • 開発環境や運用・本番環境の使い分け
  • まとめ

appsettings.jsonとは?

セクション画像

appsettings.jsonは、アプリケーションの設定情報ファイルです。 Blazor Serverプロジェクトでは、プロジェクト作成時から、デフォルトで存在しています。

WebAssemblyでは、セキュリティ的なリスクがあるため、デフォルトでは存在していません。 具体的な理由としては、wwwrootへ appsettings.json を配置しなければならないため、ブラウザの開発ツール等から 中身が見えてしまうことが考えられます。

開発ツール
開発ツールから見えてしまう・・・

DBの接続文字列等を appsettings.json 記載してしまうと、インシデントになるため、そういったリスクを抑えるためにも 扱いには気を付ける必要があります。


Blazor Serverからappsettings.json読み込み

セクション画像

appsettings.jsonのファイルを以下のようなコードに変更します。


{
  "Setting": {
    "Setting1": "Value1(appsettings.json)",
    "Setting2": "Value2(appsettings.json)",
    "Setting3": "Value3(appsettings.json)"
  }
}

続いて、appsettings.jsonSettingの構造に対応したクラスを作成します。


namespace Blazor_GetAppSettingsJson.Entities
{
    public class Setting
    {
        public string Setting1 { get; set; }
        public string Setting2 { get; set; }
        public string Setting3 { get; set; }
    }

}

Blazorにはプロパティやクラス名をappsettings.jsonの値と揃えることで、値が自動的にマッピングされる仕組みが備わっています。 名称が不一致にならないように、注意してください。

最後に、Program.csappsettings.jsonの値をページから参照できるようにサービス登録を行います。


using Blazor_GetAppSettingsJson.Data;
using Blazor_GetAppSettingsJson.Entities;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();

// ↓↓↓ 【ここにコードを追加】                         ↓↓↓
// ↓↓↓ appsettings.jsonからSettingの構造を読み込み、Settingクラスにマッピング ↓↓↓
builder.Services.Configure<Setting>(builder.Configuration.GetSection("Setting"));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

13行目に、builder.Services.Configure<Setting>(builder.Configuration.GetSection("Setting"))"を新規で追加しています。 builder.Configuration.GetSection("Setting")appsettings.jsonSettingを取得し、 それをSettingクラスに、反映してします。

動作確認を行うために、Settings.razorページを作成し、appsettings.jsonの値を表示します。 コードは以下のようになります。


@page "/settings"
@using Blazor_GetAppSettingsJson.Entities
@using Microsoft.Extensions.Options
@inject IOptions<Setting> Options

<h3>appsettings.jsonの設定値取得</h3>
<p>Setting1: @Options.Value.Setting1</p>
<p>Setting2: @Options.Value.Setting2</p>
<p>Setting3: @Options.Value.Setting3</p>

Program.csで登録したサービスの値は、IOptionインターフェース経由で取得することができます。 実際に実行すると、以下のような画面になります。

動作確認

開発環境や運用・本番環境の使い分け

セクション画像

appsettings.jsonには、開発環境や運用環境で使い分けることができる仕組みが用意されています。

Blazorでは、appsettings.Development.jsonappsettings.Production.jsonといった 命名規則に沿ったファイルを作成することで、自動的に使い分けを行うようになっています。

開発環境の場合

開発環境用の設定ファイルを使用したい場合は、appsettings.Development.jsonを用意します。

appsettings.Development.jsonは、初期状態で作成されています。 エディタ上では、appsettings.jsonに内包されているような状態になっています。

appsettings.XXXXXXX.jsonという命名規則でファイルを作成すると、このような状態になります。

appsettings.Development.json

appsettings.XXXXXXX.jsonは、appsettings.jsonに同じデータが存在している場合、その項目を上書きします。 これは、appsettings.XXXXXXX.jsonの方が優先順位が高いためです。 例えば、appsettings.Development.jsonが以下のような構造だったとします。


{
  "Setting": {
    "Setting2": "Value2(appsettings.Development.json)"
  }
}

前回のセクションで解説したappsettings.jsonと比較してみると、SettingSetting2が重複しています。 そのため、実行すると、以下のようになります。

動作確認

Setting2の値だけ、appsettings.jsonの値が上書きされていることが確認できると思います。

デバッグするときにに、appsettings.Development.jsonが使用される理由は、デバッグの環境変数で設定されているためです。 環境変数の確認するには、まず[プロジェクト]→[(プロジェクト名)のプロパティ]を開きます。

プロジェクトのプロパティ

[デバッグ]の[全般]の[デバッグ起動プロファイルUIを開く]を選択します。

デバッグ起動プロファイルUI

[デバッグ起動プロファイルUIを開く]を選択すると、以下のような画面が表示されます。

環境変数

[環境変数]にデフォルトでは、ASPNETCORE_ENVIRONMENT=DEVELOPMENTと書かれていると思います。 このDEVELOPMENTの部分が、appsettings.XXXXXXX.jsonのXXXXXXXの部分に該当します。

デバッグで使用されるappsettings.XXXXXXX.jsonを変更したい場合は、この環境変数を修正してください。

運用・本番環境の場合

運用(本番)環境の場合、appsettings.Production.jsonを用意します。 この命名規則で設定ファイルを作成すると、デプロイしたアプリケーションはこちらの設定ファイルを優先されるようになります。

appsettings.Production.json

appsettings.Production.jsonの動きを検証するために、 以下のようなデータ構造で作成します。


{
  "Setting": {
    "Setting3": "Value3(appsettings.Production.json)"
  }
}

SettingSetting3appsettings.jsonのデータと重複しているので、 デプロイ後のアプリケーションを実行すると以下のようになります。

動作確認

Setting3の値だけ、appsettings.jsonの値が上書きされていることが確認できると思います。 運用・本番環境のみに設定したい項目は、appsettings.Production.jsonを利用するようにしてください。


まとめ

セクション画像

今回は、appsettings.jsonの使い方について解説しました。 環境によって、データベースの接続先を変えたい場合などに、活用できると思います。

是非用途に合わせて、使ってみてください。


ブログ内の記事で書かれているサンプルコードは、GitHubから確認する事ができます。 是非参考にしてみてください。

この本では、Blazorの基本から高度なテクニックまで、実際のプロジェクトに役立つ知識を網羅しています。 初心者から経験者まで、Blazorを扱うすべての開発者にとっての必読書です。 この記事の執筆者も参考にした「Blazor入門」で、あなたのBlazorスキルを飛躍的に向上させませんか?

合わせて読みたい

カード画像
NavigationManagerの使い方

BlazorのNavigationManagerは、クライアントサイドのルーティングを制御するクラスで、URLの変更やページの表示を管理します。サービスを挿入することでNavigationManagerを使用でき、様々な機能が提供されます。例えば、URLの取得、ベースURIの取得、ページ遷移の制御、URL変更時のイベント通知などがあります。実際の適用例として、ボタンクリックによるページ遷移を示しています。

更新日:2023/07/25

カード画像
RenderFragmemtの使い方

Blazorでのページ作成時に共通レイアウトの再利用性を高めるため、RenderFragmentを利用する方法を紹介。RenderFragmentを使ったコンポーネントを作成し、その中でChildContentを通してページ固有の内容を指定。これにより、類似のレイアウトを持つページでもコードの重複を防ぎ効率的な実装が可能になる。

更新日:2023/07/09

An error has occurred. This application may no longer respond until reloaded. Reload 🗙