web-dev-qa-db-fra.com

Mise à jour d'ASP.NET Core appsettings.json dans le code

Je travaille actuellement sur un projet utilisant asp.net core v1.1, et dans mon appsettings.json j'ai:

"AppSettings": {
   "AzureConnectionKey": "***",
   "AzureContainerName": "**",
   "NumberOfTicks": 621355968000000000,
   "NumberOfMiliseconds": 10000,
   "SelectedPvInstalationIds": [ 13, 137, 126, 121, 68, 29 ],
   "MaxPvPower": 160,
   "MaxWindPower": 5745.35
},

J'ai également une classe que j'utilise pour les stocker:

public class AppSettings
{
    public string AzureConnectionKey { get; set; }
    public string AzureContainerName { get; set; }
    public long NumberOfTicks { get; set; }
    public long NumberOfMiliseconds { get; set; }
    public int[] SelectedPvInstalationIds { get; set; }
    public decimal MaxPvPower { get; set; }
    public decimal MaxWindPower { get; set; }
}

Et DI a permis d'utiliser ensuite dans Startup.cs:

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

Existe-t-il un moyen de modifier et d'enregistrer MaxPvPower et MaxWindPower depuis Controller?

J'ai essayé d'utiliser

private readonly AppSettings _settings;

public HomeController(IOptions<AppSettings> settings)
{
    _settings = settings.Value;
}

[Authorize(Policy = "AdminPolicy")]
 public IActionResult UpdateSettings(decimal pv, decimal wind)
 {
    _settings.MaxPvPower = pv;
    _settings.MaxWindPower = wind;

    return Redirect("Settings");
 }

Mais cela n'a rien fait.

16
Siemko

Voici un article pertinent de Microsoft concernant l'installation de la configuration dans .Net Core Apps:

Configuration du noyau Asp.Net

La page contient également exemple de code qui peut également être utile.

Mise à jour

Je pensais fournisseur en mémoire et liaison à une classe POCO pourrait être utile mais ne fonctionne pas comme prévu.

L'option suivante peut définir le paramètre reloadOnChange de AddJsonFile sur true lors de l'ajout du fichier de configuration et de l'analyse manuelle du fichier de configuration JSON et en apportant les modifications souhaitées.

    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 n'est pris en charge que dans ASP.NET Core 1.1 et versions ultérieures.

9
Ankit

Fondamentalement, vous pouvez définir les valeurs dans IConfiguration comme ceci:

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

Le problème est que par ex. le JsonConfigurationProvider n'implémente pas l'enregistrement de la configuration dans le fichier. Comme vous pouvez le voir dans le source il ne remplace pas la méthode Set de ConfigurationProvider. (voir source )

Vous pouvez créer votre propre fournisseur et y réaliser l'enregistrement. Ici (exemple de base du fournisseur personnalisé Entity Framework) est un exemple de procédure.

9
Mathias

Supposons que appsettings.json possède un port eureka et que vous souhaitiez le changer dynamiquement dans args (-p 5090). En faisant cela, vous pouvez facilement modifier le port pour docker lors de la création de nombreux services.

  "eureka": {
  "client": {
    "serviceUrl": "http://10.0.0.101:8761/eureka/",
    "shouldRegisterWithEureka": true,
    "shouldFetchRegistry": false 
  },
  "instance": {
    "port": 5000
  }
}


   public class Startup
   {
    public static string port = "5000";
    public Startup(IConfiguration configuration)
    {
        configuration["eureka:instance:port"] = port;

        Configuration = configuration;
    }


    public static void Main(string[] args)
    {
        int port = 5000;
        if (args.Length>1)
        {
            if (int.TryParse(args[1], out port))
            {
                Startup.port = port.ToString();
            }

        }
     }
0
user11907192