作为参数传递时未加载环境特定配置 - "Unhandled exception Failed to map app settings section"
Environment specific config not loaded when passed as an argument - "Unhandled exception Failed to map app settings section"
我正在尝试在新的 Windows 服务器上部署 dotnet core 3.0 Windows 服务。我有一个 ps1
脚本可以像这样创建服务:
$name = "DataTransformService"
$params = @{
Name = $name
BinaryPathName = '"C:\services\transformService\DataTransform.Service.exe Test"'
DisplayName = $name
StartupType = "Automatic"
}
New-Service @params
但是,当我尝试使用 Windows 上的 Services
应用程序启动服务并启动它时,我收到此错误:
当我尝试使用二进制文件手动调用服务时:
C:\services\transformService\DataTransform.Service.exe Test
我收到这个错误:
PS C:\services\transformService> C:\services\transformService\DataTransform.Service.exe Test
Configured for environment Test_ENVIRONMENT
Unhandled exception. System.MissingFieldException: Failed to map app settings section 'ConnectionStrings' as it wasn't found in appsettings.json or appsettings.Production.json. Add this section or remove class 'ConnectionStringsSettings' from the 'Core.Settings' namespace.
at DataTransform.Service.StartupConfiguration.ConfigureSettingsExtensions.ConfigureSettingSection[T](IServiceCollection services, IConfiguration configuration, IHostEnvironment hostingEnvironment) in D:\_Code\DataTransform.Service\DataTransform.Service\StartupConfiguration\ConfigureSettingsExtensions.cs:line 48
at DataTransform.Service.StartupConfiguration.ConfigureSettingsExtensions.ConfigureSettings(IServiceCollection services, IConfiguration configuration, IHostEnvironment hostingEnvironment) in D:\_Code\DataTransform.Service\DataTransform.Service\StartupConfiguration\ConfigureSettingsExtensions.cs:line 26
at DataTransform.Service.Program.<>c.<CreateHostBuilder>b__1_2(HostBuilderContext hostContext, IServiceCollection services) in D:\_Code\DataTransform.Service\DataTransform.Service\Program.cs:line 47
at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at DataTransform.Service.Program.Main(String[] args) in D:\_Code\DataTransform.Service\DataTransform.Service\Program.cs:line 15
我定义了一些环境,如下所示:
这是我的 Program.cs
:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args)
.Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureHostConfiguration((configBuilder) =>
{
if (args.Length > 0 && !string.IsNullOrEmpty(args[0]) && !string.IsNullOrWhiteSpace(args[0]))
{
Console.WriteLine($"Configured for environment {args[0]}_ENVIRONMENT");
configBuilder.AddEnvironmentVariables($"{args[0]}_");
}
else
{
var environmentName = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
Console.WriteLine($"Configured for environment {environmentName}");
configBuilder.AddEnvironmentVariables();
}
})
.ConfigureLogging(...)
.ConfigureServices(...);
}
这是我的appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
},
"EventLog": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
}
},
"Worker": {
"TargetDatabaseName": "TransformedData",
...
}
}
这是appsettings.Test.json
{
"ConnectionStrings": {
<connection strings here>
},
"Environment": {
"Name": "Test"
},
"Worker": {
...
}
}
我在这里错过了什么?
几天前我遇到了完全相同的问题,太奇怪了。问题是当通过 Cmd
或 Powershell
执行您的应用程序并假设它们 运行 在路径 C:\Users\YourName
时,它会尝试在此路径 C:\Users\YourName\appsettings.json
中找到 appsettings.json ]!! (如果您 copy/past 您的 appsettings.json 在该路径中,您的应用程序将 运行)。
因此,要解决此问题,您需要像这样指定基本路径:
.ConfigureHostConfiguration((configBuilder) =>
{
configBuilder.Sources.Clear();
configBuilder.SetBasePath(
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
.AddJsonFile("./appsettings.json", true, true)
.AddJsonFile($"./appsettings.{args[0]}.json", true, true);
if (args.Length > 0 && !string.IsNullOrEmpty(args[0]) && !string.IsNullOrWhiteSpace(args[0]))
{
Console.WriteLine($"Configured for environment {args[0]}_ENVIRONMENT");
configBuilder.AddEnvironmentVariables($"{args[0]}_");
}
else
{
var environmentName = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
Console.WriteLine($"Configured for environment {environmentName}");
configBuilder.AddEnvironmentVariables();
}
})
我正在尝试在新的 Windows 服务器上部署 dotnet core 3.0 Windows 服务。我有一个 ps1
脚本可以像这样创建服务:
$name = "DataTransformService"
$params = @{
Name = $name
BinaryPathName = '"C:\services\transformService\DataTransform.Service.exe Test"'
DisplayName = $name
StartupType = "Automatic"
}
New-Service @params
但是,当我尝试使用 Windows 上的 Services
应用程序启动服务并启动它时,我收到此错误:
当我尝试使用二进制文件手动调用服务时:
C:\services\transformService\DataTransform.Service.exe Test
我收到这个错误:
PS C:\services\transformService> C:\services\transformService\DataTransform.Service.exe Test
Configured for environment Test_ENVIRONMENT
Unhandled exception. System.MissingFieldException: Failed to map app settings section 'ConnectionStrings' as it wasn't found in appsettings.json or appsettings.Production.json. Add this section or remove class 'ConnectionStringsSettings' from the 'Core.Settings' namespace.
at DataTransform.Service.StartupConfiguration.ConfigureSettingsExtensions.ConfigureSettingSection[T](IServiceCollection services, IConfiguration configuration, IHostEnvironment hostingEnvironment) in D:\_Code\DataTransform.Service\DataTransform.Service\StartupConfiguration\ConfigureSettingsExtensions.cs:line 48
at DataTransform.Service.StartupConfiguration.ConfigureSettingsExtensions.ConfigureSettings(IServiceCollection services, IConfiguration configuration, IHostEnvironment hostingEnvironment) in D:\_Code\DataTransform.Service\DataTransform.Service\StartupConfiguration\ConfigureSettingsExtensions.cs:line 26
at DataTransform.Service.Program.<>c.<CreateHostBuilder>b__1_2(HostBuilderContext hostContext, IServiceCollection services) in D:\_Code\DataTransform.Service\DataTransform.Service\Program.cs:line 47
at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at DataTransform.Service.Program.Main(String[] args) in D:\_Code\DataTransform.Service\DataTransform.Service\Program.cs:line 15
我定义了一些环境,如下所示:
这是我的 Program.cs
:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args)
.Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureHostConfiguration((configBuilder) =>
{
if (args.Length > 0 && !string.IsNullOrEmpty(args[0]) && !string.IsNullOrWhiteSpace(args[0]))
{
Console.WriteLine($"Configured for environment {args[0]}_ENVIRONMENT");
configBuilder.AddEnvironmentVariables($"{args[0]}_");
}
else
{
var environmentName = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
Console.WriteLine($"Configured for environment {environmentName}");
configBuilder.AddEnvironmentVariables();
}
})
.ConfigureLogging(...)
.ConfigureServices(...);
}
这是我的appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
},
"EventLog": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
}
},
"Worker": {
"TargetDatabaseName": "TransformedData",
...
}
}
这是appsettings.Test.json
{
"ConnectionStrings": {
<connection strings here>
},
"Environment": {
"Name": "Test"
},
"Worker": {
...
}
}
我在这里错过了什么?
几天前我遇到了完全相同的问题,太奇怪了。问题是当通过 Cmd
或 Powershell
执行您的应用程序并假设它们 运行 在路径 C:\Users\YourName
时,它会尝试在此路径 C:\Users\YourName\appsettings.json
中找到 appsettings.json ]!! (如果您 copy/past 您的 appsettings.json 在该路径中,您的应用程序将 运行)。
因此,要解决此问题,您需要像这样指定基本路径:
.ConfigureHostConfiguration((configBuilder) =>
{
configBuilder.Sources.Clear();
configBuilder.SetBasePath(
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
.AddJsonFile("./appsettings.json", true, true)
.AddJsonFile($"./appsettings.{args[0]}.json", true, true);
if (args.Length > 0 && !string.IsNullOrEmpty(args[0]) && !string.IsNullOrWhiteSpace(args[0]))
{
Console.WriteLine($"Configured for environment {args[0]}_ENVIRONMENT");
configBuilder.AddEnvironmentVariables($"{args[0]}_");
}
else
{
var environmentName = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
Console.WriteLine($"Configured for environment {environmentName}");
configBuilder.AddEnvironmentVariables();
}
})