web-dev-qa-db-ja.com

コード内のASP.NET Core appsettings.jsonの更新

現在、asp.netコアv1.1を使用してプロジェクトに取り組んでおり、appsettings.jsonに次のものがあります。

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

私はそれらを保存するために使用するクラスも持っています:

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; }
}

そして、Startup.csで使用できるようになったDI:

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

ControllerからMaxPvPowerMaxWindPowerを変更して保存する方法はありますか?

使ってみた

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");
 }

しかし、それは何もしませんでした。

16
Siemko

.Net Core Appsでの設定のセットアップに関するマイクロソフトの関連記事は次のとおりです。

Asp.Net Core Configuration

ページには サンプルコード もあり、これも役立つ場合があります。

更新

インメモリプロバイダーとPOCOクラスへのバインド が役に立つかもしれないと思ったが、OPが期待どおりに動作しない。

次のオプションは、 AddJsonFilereloadOnChangeパラメーターをtrueに設定し、構成ファイルを追加し、JSON構成ファイルを手動で解析し、意図したとおりに変更することです。

    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は、ASP.NET Core 1.1以降でのみサポートされています。

9
Ankit

基本的に、次のようにIConfigurationの値を設定できます。

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

そこに問題があるのは、例えばJsonConfigurationProviderは、構成のファイルへの保存を実装しません。 source でわかるように、ConfigurationProviderのSetメソッドをオーバーライドしません。 ( source を参照)

独自のプロバイダーを作成し、そこに保存を実装できます。 ここ(Entity Frameworkカスタムプロバイダーの基本サンプル) は、その方法の例です。

9
Mathias

Appsettings.jsonにeurekaポートがあり、args(-p 5090)で動的に変更したいとします。これを行うことで、多くのサービスを作成するときに、Dockerのポートを簡単に変更できます。

  "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