Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

ASP.NET Core 6.0 の appsettings.json では "Urls" 設定が反映されない

ご無沙汰しております。MLBお兄さんこと松村です。
なかなかブログを書いてない間に MLB は2021年シーズンが終わってしまっていました。大谷選手、MVP受賞おめでとうございます!!


さて、今回は11月に一般提供が始まった .NET 6.0 の検証をしているなかで見つけた変更点を書きたいと思います。

ASP.NET Core には Kestrel という Web サーバーが内包されており、 dotnet run コマンド実行時には Kestrel を介して Web アプリケーションにアクセスします。

$ dotnet new web -n myapp60 -f net6.0
$ cd myapp60
$ dotnet run
ビルドしています...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7285
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5290
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Users\yuta\source\repos\netcore\tmp\myapp60\

ちなみに ASP.NET Core 6.0 になってから、既定のポート番号が 5000 や 5001 ではなくなりました。
5000 や 5001 じゃないと困る!って方は Properties/launchSettings.json を書き換えましょう。

launchSettings.json を変更するのではなく特定の環境のみ (Development など) ポート番号を変更したいというケースもあります。
そういった場合、これまで*1は appsettings.json や appsettings.{Environment}.json に "Urls" という項目を設けて実行時の URL を上書きすることができました。

例えば ASP.NET Core 5.0 の appsettings.json に対して以下の設定を行います。

{
  "Urls": "http://localhost:7000;https://localhost:7001",
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

dotnet run コマンドでアプリケーションを実行すると appsettings.json で指定した URL で起動します。

$ dotnet run
ビルドしています...
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:7000
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:7001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Users\yuta\source\repos\netcore\tmp\myapp50

しかし ASP.NET Core 6.0 では上述のような "Urls" 設定が反映されなくなりました。*2
実際に試してみると "Urls" 設定が Kestrel に反映されていないことがわかります。

$ cat appsettings.json 
{
  "Urls": "http://localhost:7000;https://localhost:7001",
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

$ dotnet run
ビルドしています...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7285
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5290
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Users\yuta\source\repos\netcore\tmp\myapp60\

ではどうすればいいかというところですが、 "Kestrel" 設定に対してエンドポイントの構成を行うようにします。
なお "Kestrel" 設定は .NET Core 2.1 や 3.1 の頃からある設定です。

$ cat appsettings.json 
{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:7000"
      },
      "Https": {
        "Url": "https://localhost:7001"
      }
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

$ dotnet run
ビルドしています...
warn: Microsoft.AspNetCore.Server.Kestrel[0]
      Overriding address(es) 'https://localhost:7285, http://localhost:5290'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead.
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:7000
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Users\yuta\source\repos\netcore\tmp\myapp60\

docs.microsoft.com


既存の ASP.NET Core のアプリケーションを .NET 6.0 にアップグレードしたときなど、Kestrel の URL やポート番号を以前のままにしたい場合があれば、上記の手順での設定を参考にしてみてください。

www.alterbooth.com

www.alterbooth.com

cloudpointer.tech

*1:ASP.NET Core 5.0 まで

*2:正式に廃止されたのかは確たる情報がなく、記事執筆時点では不明です