takataka430’s blog

.NET系を中心に勉強したことのまとめを書きます

ASP.NET Coreで接続文字列を使う

ASP.NET Coreを使っていて、接続文字列の扱いがよくわからなかったので調べてみました。

背景

  • ASP.NET Core でWeb APIを作りたい
  • Azure SQL Databseにつなぎたいので接続文字列が必要
  • 開発はローカルで行い、本番はAzureのApp Serviceへデプロイしたい
  • 接続文字列は
    • ソースコードに書きたくない
    • ローカルと App Serviceへのデプロイ後で別のものを使いたい

調べた結果

接続文字列を取得するコードは、例えば以下のようになります。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

namespace WebApplication1.Controllers
{
    [Route("api/test")]
    [ApiController]
    public class TestController : ControllerBase
    {
        private IConfiguration _configuration;

        public TestController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        [HttpGet]
        public string Get()
        {
            //「test」という名前の接続文字列がsに入る
            var s = _configuration.GetConnectionString("test");
            return s;
        }
    }
}

では、接続文字列はどこに記載すればいいのでしょうか。

ローカルの場合

プロジェクト内にあるappsettings.jsonに以下のように記述すると「これはローカルです」という文字列が取得できます。

{
  "ConnectionStrings": {
    "test": "これはローカルです" 
  }
}

また、もう一つの方法としてsecrets.jsonを使う方法があります。 Visual Studio 2019であれば、プロジェクトを右クリックして「ユーザーシークレットの管理」をクリックすると開くことができます。
使い方はappsettings.jsonと同じです。 このファイルはプロジェクトとは別の場所(C:\Users\[username]\AppData\Roaming\Microsoft\UserSecrets\[id]\secrets.json)にあります。

secret.jsonの方がソースコードに含まれないので安心して使えると思います。

App Service(Web Apps)の場合

「構成」を開き、画面下の「接続文字列」という場所があります。「新しい接続文字列」から名前と値を登録しましょう。
こうすると、AppService側でローカルとは異なる接続文字列を設定することができます。

f:id:takataka430:20210529155144p:plain

以上により、ローカル環境とAppService環境で接続文字列を使い分けることができます。

参考

Azure Web Apps の環境変数の管理の基本 ( Key Vault と User Secrets ) - BEACHSIDE BLOG