如何从ASP.NET Core中的.json文件读取AppSettings值


246

我已经在文件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中做到这一点?




只需使用IConfiguration的依赖项注入(在.net core 2.0中),就可以简化此过程。这是在这里解释coding-issues.com/2018/10/...
Ranadheer雷迪

@RanadheerReddy,依赖注入适用于控制器。但是,如果有人需要读取中间件中的值怎么办?
亚历山大·赖安·巴格特

Answers:


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"。非常感谢!
Oluwafemi

2
我需要将设置从实用程序类传递到另一层,因此我需要类似此公共静态字符串GetConnectionString(){if(string.IsNullOrEmpty(connectionString)){var builder = new ConfigurationBuilder().AddJsonFile(“ config.json “); 配置= builder.Build(); connectionString = Configuration.Get(“ Data:DefaultConnection:ConnectionString”); 返回connectionString; }
dnxit 2015年

2
我得到Argument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
彼得

5
添加nuget后,Microsoft.Extensions.Options.ConfigurationExtensions它按预期工作。
彼得

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

可以请共享配置的JSON“的AppSettings”以供参考
ANKIT森

我需要类中的整个appSettings.json配置,为此,我根据JSON设计了类,并用于Configuration.Get<AppSettings>()反序列化整个文件而不是特定部分。
Nilay

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


请注意,您仍然需要将.AddJsonFile(“ yourfile.json”)扔到ConfigConfiguration中。IE,您需要告诉它文件在哪里。在答案中没有看到。
埃里克(Eric)

埃里克(Eric),我会重新测试一下,我不记得要添加那行了。仅当json文件的名称不是默认名称时才有必要吗?
MDMoore313 '18

根据MSDN,ASPNETCORE 2.0不需要它,尽管它似乎也不适合我。 docs.microsoft.com/en-us/dotnet/api/...
周六瑟尔

1
我可以确认必须构建一个ConfigurationBuilder()对象并调用AddJSONFile()才能将appSettings.json文件加载到配置字典中。这是ASP.NET Core 2.0。这是与MSDN所说的相反的错误吗?
星期六星期六

1
您能否举个例子,说明如何将StorageOptions注入控制器?如果我使用hug的将依赖项注入与结合使用的方法,则会public HomeController(IOptions<StorageOptions> settings)收到以下错误消息:模型绑定的复杂类型不能为抽象或值类型,并且必须具有无参数构造函数。
Jpsy

29

如果您只想获取令牌的值,请使用

Configuration["AppSettings:token"]


4
为此,您需要事先通过ConfigurationBuilder初始化IConfiguration实例。
ΕГИІИО

29

使用.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

...,您可以执行以下操作:config [“ Storage:ConnectionString”]以获取json中的元素。我可以确认该技术可以在.net core 3上使用,也可以在构造注入上使用。
马里奥Meyrelles

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的完整用例!

article.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”哪个版本?
史蒂夫·史密斯,

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

2
They just keep changing things。这个。本页上的几乎所有答案仅适用于特定版本的.Net Core。
史蒂夫·史密斯,

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

在这里,我创建了一个类来获取连接字符串和应用程序设置。

我在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/zh-cn/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,然后从其中读取应用设置,可以使用以下方法之一:

  1. 获取板块数据

    var redisConfig = configuration.GetSection("RedisConfig");
  2. 在部分中获取值

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. 在部分中获取嵌套值

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

注射作品控制器,但如果我想使用它的中间件像什么位置?EG我正在使用Redis作为中间件来缓存http响应。
亚历山大·赖安·巴格特

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启动

将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"
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.