Warm tip: This article is reproduced from stackoverflow.com, please click
.net-core .net-core-3.1

.net core 3.1 Console App The configuration file 'appsettings.json' was not found

发布于 2021-01-21 11:50:19

When running a console app outside of a local environment, .net core 3.1 is looking for the appsettings.json file in a different directory than where the program executes.

  • The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\windows\system32\appsettings.json'.

In previous versions of dotnet using the Environment.CurrentDirectory or Directory.GetCurrentDirectory() but not working in 3.1. How do you change this so that it looks in the directory where it is running? The below does not work

        using var host = Host.CreateDefaultBuilder()
            .ConfigureHostConfiguration(builder =>
            {
                builder.SetBasePath(Environment.CurrentDirectory);                    
                builder.AddCommandLine(args);
            })
            .UseConsoleLifetime(options => options.SuppressStatusMessages = true)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureAppConfiguration((hostContext, builder) =>
            {
                builder.AddJsonFile("appsettings.json");
                hostContext.HostingEnvironment.EnvironmentName = Environment.GetEnvironmentVariable("NETCORE_ENVIRONMENT");
                if (hostContext.HostingEnvironment.EnvironmentName == Environments.Development)
                {
                    builder.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true);
                    builder.AddUserSecrets<Program>();
                }
            })
Questioner
Shiloh
Viewed
0
Shiloh 2020-09-24 08:02

This seems to work, by getting the base directory from AppDomain.CurrentDomain before setting the base path. I still do not understand why this was not required in previous dotnet versions and I was unable to find any MS documentation on this.

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

        using var host = Host.CreateDefaultBuilder()
            .ConfigureHostConfiguration(builder =>
            {
                builder.SetBasePath(Directory.GetCurrentDirectory());                    
                builder.AddCommandLine(args);
            })