web-dev-qa-db-ja.com

ASP.NET Coreの.jsonファイルからAppSettings値を読み上げる方法

私はこのようにappsettings/Config .jsonで私のAppSettingsデータを設定しました:

{
  "AppSettings": {
        "token": "1234"
    }
}

.jsonファイルからAppSettings値を読み取る方法をオンラインで検索しましたが、何も役に立ちませんでした。

私は試した:

var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null

私はあなたがこれをすることができるASP.NET 4.0で知っています:

System.Configuration.ConfigurationManager.AppSettings["token"];

しかし、どうすればASP.NET Coreでこれを行うことができますか?

141
Oluwafemi

これにはいくつかの工夫が必要です。私は ASP.NET Core 2.0 で最新になるようにこの答えを修正しました(26/02/2018現在)。

これは主に 公式ドキュメント :から取られます。

ASP.NETアプリケーションの設定を操作するには、アプリケーションのConfigurationクラスでのみStartupをインスタンス化することをお勧めします。次に、Optionsパターンを使用して個々の設定にアクセスします。このようなappsettings.jsonファイルがあるとしましょう。

{
  "MyConfig": {
   "ApplicationName": "MyApp",
   "Version": "1.0.0"
   }

}

そして設定を表すPOCOオブジェクトがあります。

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

今度はStartup.csで設定を構築します。

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();
    }
}

appsettings.jsonは、.NET Core 2.0では デフォルトで登録される になることに注意してください。必要に応じて、環境ごとにappsettings.{Environment}.json設定ファイルを登録することもできます。

設定をコントローラに注入したい場合は、それをランタイムに登録する必要があります。 Startup.ConfigureServicesを介してそうします。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}

そしてこれを次のように注入します。

public class HomeController : Controller
{
    private readonly IOptions<MyConfig> config;

    public HomeController(IOptions<MyConfig> config)
    {
        this.config = config;
    }

    // GET: /<controller>/
    public IActionResult Index() => View(config.Value);
}

完全なStartupクラス:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // Add functionality to inject IOptions<T>
        services.AddOptions();

        // Add our Config object so it can be injected
        services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
    }
}
196
Yuval Itzchakov

最初:Microsoft.Framework.ConfigurationModelのアセンブリ名と名前空間はMicrosoft.Framework.Configurationに変更されました。それで、あなたは使うべきです:.

"Microsoft.Framework.Configuration.Json": "1.0.0-beta7"

project.jsonの依存関係として。 7がインストールされていない場合はbeta5または6を使用してください。それならStartup.csでこんなことができます。

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
     var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
     Configuration = configurationBuilder.Build();
}

その後、config.jsonから変数を取得したい場合は、次のようにしてすぐに取得できます。

public void Configure(IApplicationBuilder app)
    {
        // Add .Value to get the token string
        var token = Configuration.GetSection("AppSettings:token");
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("This is a token with key (" + token.Key + ") " + token.Value);
        });
    }

あるいは、AppSettingsというクラスを次のようにして作成することもできます。

public class AppSettings
{
    public string token { get; set; }
}

次のようにサービスを設定します。

public void ConfigureServices(IServiceCollection services)
{       
    services.AddMvc();

    services.Configure<MvcOptions>(options =>
    {
        //mvc options
    });

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

そしてそれを介してそれにアクセスします。このようなコントローラ:

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}
51
hug

.NET Core 2.0では、状況が少し変わりました。スタートアップコンストラクタはConfigurationオブジェクトをパラメータとして受け取るので、ConfigurationBuilderを使用する必要はありません。これが私のものです:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<StorageOptions>(Configuration.GetSection("AzureStorageConfig"));
}

私のPOCOは冒頭に述べたStorageOptionsオブジェクトです。

namespace Brazzers.Models
{
    public class StorageOptions
    {
        public String StorageConnectionString { get; set; }
        public String AccountName { get; set; }
        public String AccountKey { get; set; }
        public String DefaultEndpointsProtocol { get; set; }
        public String EndpointSuffix { get; set; }

        public StorageOptions() { }
    }
}

そして設定は実際にはAzureStorageConfigという名前の私のappsettings.jsonファイルのサブセクションです:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=brazzerswebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "AzureStorageConfig": {
    "AccountName": "brazzerswebapp",
    "AccountKey": "Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==",
    "DefaultEndpointsProtocol": "https",
    "EndpointSuffix": "core.windows.net",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=brazzerswebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  }
}

私が追加する唯一のことは、コンストラクタが変更されたので、appsettings.<environmentname>.jsonに対してappsettings.jsonをロードするために何か特別なことをする必要があるかどうかをテストしていないことです。

32
MDMoore313

あなただけのトークンの値を取得したい場合はを使用してください

Configuration["AppSettings:token"]

14
Mani

以下はコンソールアプリのための作品です。

1-以下のnugetパッケージ(.csproj)をインストールしてください。

<ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0-preview2-35157" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0-preview2-35157" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0-preview2-35157" />
  </ItemGroup>

2-ルートレベルでappsettings.jsonを作成します。それを右クリックし、「 新しい場合はコピー 」のように「出力ディレクトリにコピー」.

3-サンプル設定ファイル:

{
  "AppConfig": {
    "FilePath": "C:\\temp\\logs\\output.txt"
  }
}

4- Program.cs

configurationSection.KeyconfigurationSection.Valueは設定プロパティを持ちます。

static void Main(string[] args)
{
    try
    {

        IConfigurationBuilder builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        IConfigurationRoot configuration = builder.Build();
        // configurationSection.Key => FilePath
        // configurationSection.Value => C:\\temp\\logs\\output.txt
        IConfigurationSection configurationSection = configuration.GetSection("AppConfig").GetSection("FilePath");  

    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}
9
Teoman shipahi

Yuval Itzchakovの答えを補完するためだけのものです。

あなたはビルダー関数なしで設定を読み込むことができます、あなたはそれを注入することができます。

public IConfiguration Configuration { get; set; }

public Startup(IConfiguration configuration)
{
   Configuration = configuration;
}
6
Tiago Barroso

.NET Core 2.0では、次のことが簡単にできます。

appsettings.jsonでキーと値のペアを宣言します。 /

{
  "MyKey": "MyValue"
}

startup.csに設定サービスを挿入し、サービスを使用して値を取得します

using Microsoft.Extensions.Configuration;

public class Startup
{
    public void Configure(IConfiguration configuration,
                          ... other injected services
                          )
    {
        app.Run(async (context) =>
        {
            string myValue = configuration["MyKey"];
            await context.Response.WriteAsync(myValue);
        });
6
Chris Halcrow

既存の回答に加えて、私は簡単のためにIConfigurationに対して 拡張メソッド を持つことが役に立つかもしれないことを言及したいと思います。

私はJWTの設定をappsettings.jsonに保存しているので、私の拡張メソッドクラスは次のようになります。

public static class ConfigurationExtensions
{
    public static string GetIssuerSigningKey(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:SecurityKey");
        return result;
    }

    public static string GetValidIssuer(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Issuer");
        return result;
    }

    public static string GetValidAudience(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Audience");
        return result;
    }

    public static string GetDefaultPolicy(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Policies:Default");
        return result;
    }

    public static SymmetricSecurityKey GetSymmetricSecurityKey(this IConfiguration configuration)
    {
        var issuerSigningKey = configuration.GetIssuerSigningKey();
        var data = Encoding.UTF8.GetBytes(issuerSigningKey);
        var result = new SymmetricSecurityKey(data);
        return result;
    }

    public static string[] GetCorsOrigins(this IConfiguration configuration)
    {
        string[] result =
            configuration.GetValue<string>("App:CorsOrigins")
            .Split(",", StringSplitOptions.RemoveEmptyEntries)
            .ToArray();

        return result;
    }
}

それはあなたに多くの行を節約し、あなたはただきれいで最小限のコードを書くだけです:

...
x.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateIssuerSigningKey = true,
    ValidateLifetime = true,
    IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
    ValidAudience = _configuration.GetValidAudience(),
    ValidIssuer = _configuration.GetValidIssuer()
};

IConfigurationインスタンスをシングルトンとして登録し、必要なところにそれをインジェクトすることも可能です。Autofacコンテナを使用する方法は次のとおりです。

var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();

MS依存性注入でも同じことができます。

services.AddSingleton<IConfigurationRoot>(appConfiguration);
5
Alex Herman

Core 2.2で、そして最も簡単な方法で...

public IActionResult Index([FromServices] IConfiguration config) { var myValue = config.GetValue<string>("MyKey"); }

appsettings.jsonは自動的にロードされ、コンストラクタまたはアクションインジェクションを通じて利用可能です。また、IConfigurationにはGetSectionメソッドもあります。必要なのがappsettings.jsonだけであれば、Startup.csやProgram.csを変更する必要はありません。

4
tnJed

彼らはただ物事を変え続けています - ちょうどVSを更新しプロジェクト全体の爆弾を持っていた、回復への道、そして新しい方法はこのように見えます:

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

    if (env.IsDevelopment())
    {
        // For more details on using the user secret store see http://go.Microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

私はこの行を見逃していました!

.SetBasePath(env.ContentRootPath)
3
Monolithcode

それでこれは良い習慣ではないかと思いますが、それはローカルで動作しています。([IIS Webサービスへの)公開/デプロイ時に失敗した場合は更新します。

ステップ1.)このアセンブリをクラス(私の場合はコントローラクラス)の一番上に追加します。

using Microsoft.Extensions.Configuration;

ステップ2)これまたはそれに似たものを追加:

var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json").Build();

ステップ3.)これを実行してキーの値を呼び出します(文字列を返します)。

config["NameOfYourKey"]

以下のコードを試すことができます。これは私のために働いています。

public class Settings
    {
        private static IHttpContextAccessor _HttpContextAccessor;
        public Settings(IHttpContextAccessor httpContextAccessor)
        {
            _HttpContextAccessor = httpContextAccessor;
        }
        public static void Configure(IHttpContextAccessor httpContextAccessor)
        {
            _HttpContextAccessor = httpContextAccessor;
        }
        public static IConfigurationBuilder Getbuilder()
        {
            var builder = new ConfigurationBuilder()
              .SetBasePath(Directory.GetCurrentDirectory())
              .AddJsonFile("appsettings.json");
            return builder;
        }

        public static string GetAppSetting(string key)
        {
            //return Convert.ToString(ConfigurationManager.AppSettings[key]);
            var builder = Getbuilder();
            var GetAppStringData = builder.Build().GetValue<string>("AppSettings:" + key);
            return GetAppStringData;
        }

        public static string GetConnectionString(string key="DefaultName")
        {
            var builder = Getbuilder();
            var ConnectionString = builder.Build().GetValue<string>("ConnectionStrings:"+key);
            return ConnectionString;
        }
    }

ここで、接続文字列とアプリの設定を取得するための1つのクラスを作成しました。

以下のようにクラスを登録する必要があるStartup.csファイル。

public class Startup
{      

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {           

        var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        Settings.Configure(httpContextAccessor);
    }
}
2
jishan siddique

これは「浮気」でしたか? StartupクラスでConfigurationを静的にしただけで、他の場所からアクセスできます。

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.Microsoft.com/fwlink/?LinkID=398940
    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();
    }

    public static IConfiguration Configuration { get; set; }
1
Brian Moore

Get<YourType>()を呼び出してコントローラーとしてオブジェクトとして取得します

public IActionResult Index([FromServices] IConfiguration config) { BillModel model= config.GetSection("Yst.Requisites").Get<BillModel>(); return View(model); }

0

これがASP.NET Coreの完全なユースケースです。

articles.json

{
  "shownArticlesCount": 3,
  "articles": [
    {
      "title": "My Title 1",
      "thumbnailLink": "example.com/img1.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
    {
      "title": "My Title 2",
      "thumbnailLink": "example.com/img2.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
  ]
}

ArticleContainer.cs

public class ArticleContainer
{
    public int ShownArticlesCount { get; set; }

    public List<Article> Articles { get; set; }
}

public class Article
{
    public string Title { get; set; }

    public string ThumbnailLink { get; set; }

    public string AuthorName { get; set; }

    public string AuthorProfileLink { get; set; }

    public DateTime PublishDate { get; set; }

    public string Text { get; set; }

    public string Link { get; set; } 
}

Startup.cs

public class Startup
{
    public IConfigurationRoot ArticleConfiguration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        ArticleConfiguration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("articles.json")
            .Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();

        services.Configure<ArticleContainer>(ArticleConfiguration);
    }
}

Index.cshtml.cs

public class IndexModel : PageModel
{
    public ArticleContainer ArticleContainer { get;set; }

    private readonly IOptions<ArticleContainer> _articleContainer;

    public IndexModel(IOptions<ArticleContainer> articleContainer)
    {
        _articleContainer = articleContainer;
    }

    public void OnGet()
    {
        ArticleContainer = _articleContainer.Value;
    }
}

Index.cshtml.cs

<h1>@Model.ArticleContainer.ShownArticlesCount</h1>
0
Alper Ebicoglu