ASP.NET Coreで.jsonファイルからAppSettings値を読み取る方法


247

AppSettingsデータを次のようにappsettings / Config .jsonファイルに設定しました。

{
  "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でこれを行うにはどうすればよいですか?




これは、(。net core 2.0の)IConfigurationの依存関係の注入を使用するだけで簡単にできます。ここで説明されているcoding-issues.com/2018/10/...
Ranadheerレディ

@RanadheerReddy、依存関係注入はコントローラーに対して機能します。しかし、ミドルウェアの値を読み取る必要がある場合はどうでしょうか。
アレクサンダーライアンバゲット

回答:


319

これにはいくつかのねじれと回転がありました。ASP.NET Core 2.0で最新になるように、この回答を変更しました(2018年2月26)。

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

ASP.NETアプリケーションの設定を操作するにConfigurationは、アプリケーションのStartupクラスでのみインスタンス化することをお勧めします。次に、オプションパターンを使用して個々の設定にアクセスします。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();
    }
}

.NET Core 2.0ではデフォルト登録さappsettings.jsonれることに注意してください。必要に応じて、環境ごとに設定ファイルを登録することもできます。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"));
    }
}

3
バージョン"1.0.0-beta4"は私のでは動作しません"1.0.0-alpha4"。どうもありがとう!
オルワフェミ2015

2
ユーティリティクラスから別のレイヤーに設定を渡す必要があるため、このような静的な文字列GetConnectionString(){if(string.IsNullOrEmpty(connectionString)){var builder = new ConfigurationBuilder().AddJsonFile( "config.json "); 構成= builder.Build(); connectionString = Configuration.Get( "Data:DefaultConnection:ConnectionString"); }} return connectionString; }
dnxit

2
私が得るArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
ピーターは

5
nugetを追加した後Microsoft.Extensions.Options.ConfigurationExtensions、期待どおりに機能しました。
Peter

2
構成プロセスロジックの説明はすばらしいですが、重要な点はありません。SetBasePath()とAddJsonFile()は、別個のアセンブリのフレームワークに深く埋め込まれている拡張メソッドです。したがって、開始するには、Microsoft.Extensions.Configurationに加えて、Microsoft.Extensions.Configuration.FileExtensionsとMicrosoft.Extensions.Configuration.Jsonをインストールする必要があります。
Bozhidar Stoyneff

63

まず、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;
    }
}

参考のため、「AppSettings」の構成jsonを共有してください
Ankit Mori

クラスにappSettings.json設定全体が必要です。これのために、JSONに従ってクラスを設計しConfiguration.Get<AppSettings>()、特定のセクションではなくファイル全体を逆シリアル化するために使用しました。
ニレイ

52

.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 FictionalWebApp.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() { }
    }
}

そして、コンフィギュレーションは、実際に私のサブセクションであるappsettings.jsonという名前のファイルAzureStorageConfig

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

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

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


ConfigConfigurationに.AddJsonFile( "yourfile.json")をトスする必要があることに注意してください。IE、ファイルの場所を伝える必要があります。答えでそれを見なかった。
エリック

エリック私はそれを再テストします。その行を追加したことを覚えていません。jsonファイルの名前がデフォルトの名前でない場合にのみ必要ですか?
MDMoore313 2018年

MSDNによれば、ASPNETCORE 2.0には必要ありませんが、私には動作しないようです。 docs.microsoft.com/en-us/dotnet/api/...
土曜サーウ

1
ConfigurationBuilder()オブジェクトを構築し、AddJSONFile()を呼び出してappSettings.jsonファイルを構成辞書にロードする必要があったことを確認できます。これはASP.NET Core 2.0です。これは、MSDNの発言に反して実行されるバグですか?
2018年

1
StorageOptionsをコントローラーに注入する方法の例を挙げられますか?との依存関係注入を使用するハグのアプローチを使用するとpublic HomeController(IOptions<StorageOptions> settings)、次のエラーメッセージが表示されます。
Jpsy

30

.NET Core 2.2では、可能な限り最も簡単な方法で...

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

appsettings.jsonは自動的に読み込まれ、コンストラクタまたはアクションインジェクションのいずれかを介して利用できます。また、GetSectionメソッドIConfigurationもあります。そこに変更する必要はないですStartup.csか、Program.csあなたが必要とするすべてがある場合appsettings.json


2
さらにシンプル:var myValue = config["MyKey"]
jokab

...そして、json内の要素を取得するためにconfig ["Storage:ConnectionString"]を実行できます。この手法が.net core 3で機能し、コンストラクションインジェクションで機能することを確認できます。
マリオMeyrelles

29

トークンの値を取得するだけの場合は、

Configuration["AppSettings:token"]


4
これを機能させるには、事前にConfigurationBuilderを介してIConfigurationインスタンスを初期化する必要があります。
ΕГИІИО

20

.NET Core 3.0

多分それはappsettings.jsonから値を取得するための最良の方法ではありませんが、それは簡単で、私のアプリケーションで機能します!!

ファイルappsettings.json

{
    "ConnectionStrings": {
        "DefaultConnection":****;"
    }

    "AppSettings": {
        "APP_Name": "MT_Service",
        "APP_Version":  "1.0.0"
    }
}

コントローラ:

上に

using Microsoft.Extensions.Configuration;

あなたのコードで:

var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];

かなり簡単です。これをありがとう、あなたは私を助けました!
マット

AddJsonFileがConfigurationBuilderに存在しない
Essej

10

以下はコンソールアプリケーションで機能します。

  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.Keyそして、configurationSection.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);
        }
    }

8

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

8

これは良い習慣だとは思いませんが、ローカルで機能しています。(IIS Webサービスに)公開/展開するときに失敗した場合は、これを更新します。

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

using Microsoft.Extensions.Configuration;

ステップ2-これまたはそれに似たものを追加します。

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

ステップ3-次のようにしてキーの値を呼び出します(文字列を返します):

config["NameOfYourKey"]

appsettings.json正しいディレクトリにある限り、これは問題ないと思います
Ju66ernaut

7

ユヴァル・イチャコフの答えを補足するために。

あなたはビルダー機能なしで設定をロードすることができます、あなたはそれを単に注入することができます。

public IConfiguration Configuration { get; set; }

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

6

既存の回答に加えて、簡単にするため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 Dependency Injectionでも同じことができます。

services.AddSingleton<IConfigurationRoot>(appConfiguration);

6

これが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>

「ASP.NET Core」のバージョンは?
Steve Smith、

5

彼らはただ物事を変え続けています-Visual Studioを更新し、プロジェクト全体を爆破し、回復への道のりをたどっています。新しい方法は次のようになります。

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)

1
同じ方法でテストプロジェクトのAppSettings値を取得するにはどうすればよいですか?
S.Siva 2016

2
They just keep changing things。この。このページのほとんどすべての回答は、.Net Coreの特定のバージョンにのみ適用されます。
Steve Smith、

4

.NET Core 2.1.0

  1. ルートディレクトリに.jsonファイルを作成する
  2. あなたのコードで:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3.次の依存関係をインストールします。

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json

4.次に、重要: appsettings.jsonファイルを右クリックし、[プロパティ]をクリックして、[新しい場合はコピー]を選択します。 ここに画像の説明を入力してください

  1. 最後に、次のことができます。

    config ["key1"]

私の設定ファイルが次のようになることを考えると:

{
    "ConnectionStrings": "myconnection string here",
    "key1": "value here"
}

2

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

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

ASP.NET Core 3.1の場合、次のドキュメントに従ってください。

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

新しいASP.NET Core 3.1プロジェクトを作成すると、次の構成行が含まれProgram.csます。

Host.CreateDefaultBuilder(args)

これにより、次のことが可能になります。

  1. ChainedConfigurationProvider:ソースとして既存のIConfigurationを追加します。デフォルトの構成の場合、ホスト構成を追加し、アプリ構成の最初のソースとして設定します。
  2. JSON設定プロバイダーを使用するappsettings.json。
  3. JSON設定プロバイダーを使用するappsettings.Environment.json たとえば、appsettings.Production.jsonやappsettings.Development.jsonなどです。
  4. アプリが開発環境で実行されるときのアプリシークレット。
  5. 環境変数構成プロバイダーを使用した環境変数。
  6. コマンドライン構成プロバイダーを使用したコマンドライン引数。

つまりIConfiguration、ネストされた値であっても、文字列キーを使用して値を注入およびフェッチできます。お気に入りIConfiguration ["Parent:Child"];

例:

appsettings.json

{
  "ApplicationInsights":
    {
        "Instrumentationkey":"putrealikeyhere"
    }
}

WeatherForecast.cs

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;
    private readonly IConfiguration _configuration;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var key = _configuration["ApplicationInsights:InstrumentationKey"];

        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

@Ogglas ... WeatherForecastController()の呼び出し元がIConfigurationを実装するクラスを取得するにはどうすればよいですか?
Johnny Wu

1

これは「不正行為」でしたか?スタートアップクラスの構成を静的にしただけで、他のどこからでもアクセスできます。

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

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

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

1

最初にIConfigurationを注入し、次にappsettingsから読み取るために、次のいずれかの方法を使用できます。

  1. セクションデータを取得する

    var redisConfig = configuration.GetSection("RedisConfig");
  2. セクション内の値を取得する

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. セクション内のネストされた値を取得する

    var redisExpireMInutes = configuration.GetValue<int>("RedisConfig:ServerName:ExpireMInutes");

注入はコントローラーで機能しますが、ここのようにミドルウェアで使用したい場合はどうなりますか?EG HTTP応答をキャッシュするミドルウェアとしてRedisを使用しています。
アレクサンダーライアンバゲット

1

.NET Core 2.2の方法

(間違いなく、Microsoftは次の.NETバージョンで完全に別のものに変更する予定です。)

1. appSettings.json

それはこのように見えるかもしれません。ここでは、Setting1とSetting2をロードします。

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Setting1": "abc",
  "Setting2": 123
}

2. AppSettings.cs

POCOの設定1と設定2を保持するクラス。appsettings.jsonをこのクラスオブジェクトにロードします。POCOクラスの構造はJSONファイルと一致する必要があります。必要に応じて、プロパティを他のプロパティ/クラス内にネストできます。

public class AppSettings
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}

3 Startup.cs

appSettings.jsonをAppSettingsオブジェクトにロードし、使用を開始します。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        AppSettings settings = new AppSettings();

        Configuration = configuration;
        configuration.Bind(settings);

        // Now start using it
        string setting1 = settings.Setting1;
        int setting2 = settings.Setting2;
    }

0

netcoreapp 3.1の最新版がリリースされたので、サードパーティの依存関係なしでこれをかなり簡単に行うことができます。

このの要点作成しましたが、このクラスを使用してJSONファイルを読み取り、動的プロパティを返すことができます。

using System.Text.Json;
using System.IO;

class ConfigurationLoader
{

    private dynamic configJsonData;
    public ConfigurationLoader Load(string configFilePath = "appsettings.json")
    {
        var appSettings = File.ReadAllText(configFilePath);
        this.configJsonData = JsonSerializer.Deserialize(appSettings, typeof(object));
        return this;
    }

    public dynamic GetProperty(string key)
    {
        var properties = key.Split(".");
        dynamic property = this.configJsonData;
        foreach (var prop in properties)
        {
            property = property.GetProperty(prop);
        }

        return property;
    }
}

dotnetコンソールアプリケーションでappconfig.jsonを使用できるように、これを具体的に作成しました。私はこれを自分のProgram.Main関数に入れます:

var config = new ConfigurationLoader();
config.Load();
Console.WriteLine(config.GetProperty("Environment.Name"));

そして、これはdynamicプロパティのオブジェクトを返します。(プリミティブでない場合はJsonElement)。私のappsettings.jsonファイルは次のようになります:

{
  "Environment": {
    "Token": "abc-123",
    "Name": "Production"
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.