1
votes

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>();
                }
            })
2

2 Answers

2
votes

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);
            })
1
votes

We add appsettings like this:

public Startup(IWebHostEnvironment env)
        {    
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
...
}