There is a typo/wrong value set in your connection variables.
Which can be seen in this output you pasted:
Variable Value
ConnectionStrings:TestDb "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
This likely happend while setting the variable via
$env:ConnectionStrings:MyDb = """Server=..."""
the correct way is to set it without the quotation marks.
$env:ConnectionStrings:MyDb = "Server=..."
Old answer (for other users who may search for similar issues)
The convention for connection strings is SQLCONNSTR_, MYSQLCONNSTR_, SQLAZURECONNSTR_ and CUSTOMCONNSTR_ which are used by Azure Web Apps, but should also work for self-hosting, VMs or any other cloud provider.
So if you have an environment variable called CUSTOMCONNSTR_TestDb it will be the same as defining it in appsettings.json in
{
"connectionStrings": {
"TestDb": "..."
}
}
It will also override the value inside it, if AddEnvironmentVariables() is called after .UseJsonFile(...). Last registration wins.
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
// This one needs to be last
.AddEnvironmentVariables();
You can also use other variables to override configuration values. iirc. ASPNETCORE_ is the default prefix (but you can change it in the AddEnvironmentVariables("MY_")).
So a ASPNETCORE_MySettings overrides Configuration["MySettings"] (or Configuration.Get("MySettings")) and ASPNETCORE_My__Settings (use double underscore for level hierarchy on Linux, read where : is used to obtain the config – Linux disallows colon in variable names) overrides Configuration["My:Settings"] so same as
{
"my": {
"settings": "..."
}
}
Unless they changed that recently.
FWIW: Environment variables/configuration key names are case-insensitive as far as I remember.