ASP.NET Core appsettings.json update in code ASP.NET Core appsettings.json update in code json json

ASP.NET Core appsettings.json update in code


Basically you can set the values in IConfiguration like this:

IConfiguration configuration = ...// ...configuration["key"] = "value";

The issue there is that e.g. the JsonConfigurationProvider does not implement the saving of the configuration into the file. As you can see in the source it does not override the Set method of ConfigurationProvider. (see source)

You can create your own provider and implement the saving there. Here (Basic sample of Entity Framework custom provider) is an example how to do it.


Here is a relevant article from Microsoft regarding Configuration setup in .Net Core Apps:

Asp.Net Core Configuration

The page also has sample code which may also be helpful.

Update

I thought In-memory provider and binding to a POCO class might be of some use but does not work as OP expected.

The next option can be setting reloadOnChange parameter of AddJsonFile to true while adding the configuration file andmanually parsing the JSON configuration file and making changes as intended.

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

... reloadOnChange is only supported in ASP.NET Core 1.1 and higher.


I took Qamar Zamans code (thank you) and modified it to allow for editing parameters which are more:than:one:layer:deep.

Hope it helps someone out, surprised that this isn't a library feature somewhere.

public static class SettingsHelpers{    public static void AddOrUpdateAppSetting<T>(string sectionPathKey, T value)    {        try        {            var filePath = Path.Combine(AppContext.BaseDirectory, "appsettings.json");            string json = File.ReadAllText(filePath);            dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json);            SetValueRecursively(sectionPathKey, jsonObj, value);            string output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented);            File.WriteAllText(filePath, output);        }        catch (Exception ex)        {            Console.WriteLine("Error writing app settings | {0}", ex.Message);        }    }    private static void SetValueRecursively<T>(string sectionPathKey, dynamic jsonObj, T value)    {        // split the string at the first ':' character        var remainingSections = sectionPathKey.Split(":", 2);        var currentSection = remainingSections[0];        if (remainingSections.Length > 1)        {            // continue with the procress, moving down the tree            var nextSection = remainingSections[1];            SetValueRecursively(nextSection, jsonObj[currentSection], value);        }        else        {            // we've got to the end of the tree, set the value            jsonObj[currentSection] = value;         }    }