c# - 如何从 .Net Core 中的多个 json 文件中读取值?
问题描述
我想从多个 json 文件中读取值。从默认 json 文件中获取值,但无法读取单独添加的 json 文件。下面是我的代码。
//Reads from endpoint-defaults.json
var endpointDefaultsBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("endpoint-defaults.json", true, true)
.AddEnvironmentVariables();
ConfigurationEndpointDefaults = endpointDefaultsBuilder.Build();
string signOnType = ConfigurationEndpointDefaults.GetSection("AppSettings:mastercard.mip.signOnType").Value;
var mscdGamingList = ConfigurationEndpointDefaults.GetSection("AppSettings:paymentPostCountryProhibitionCheckStage.mscdGamingList.list").Get<string[]>();
//Reads from config.json
var configbuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("jsconfig1.json", true, true)
.AddEnvironmentVariables();
Configuration = configbuilder.Build();
string environmentMode = Configuration.GetSection("AppSettings:mastercard.mip.hostname").Value;
我的 Json 文件
端点-defaults.json
{
"AppSettings": { //Default MasterCard properties "mastercard.mip.signOnType": "ONDEMAND", "mastercard.mip.responseTimeout": 30, }
}
jsconfig1.js
{
“应用程序设置”:{
"mastercard.mip.hostname": "localhost", "mastercard.mip.authorisation_port": 19092, "mastercard.mip.test_authorisation_port": 19094,
}
}
解决方案
您始终可以在构建 .net 核心应用程序的配置时使用多个 json 配置文件。您还可以包含 XML 配置文件。
我对配置结构和您使用的值知之甚少。所以这里我将用一个简单的配置示例和一个asp.net核心应用来解释。
我有两个配置文件。
- 应用设置.json
- apisettings.json
上述两个配置文件中都有多个配置部分。
//appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"DbSettings": {
"ConnectionString": "Data Source=localhost; Initial Catalog=CareCMSDatabase;User ID=sa; Password=Password1; TimeOut=30;"
},
"SmtpSettings": {
"UserName": "someemail@domain.com",
"Host": "someserver.smtp.com",
"Port": "587",
"Password": "password"
}
}
//apisettings.json
{
"ProductApi": {
"BaseUrl": "https://www.products.com/",
"AuthEndpoint": "api/2.0/Auth/",
"ClientId": "somelcientid",
"ClientSecret": "someclientsecret"
},
"SearchApi": {
"BaseUrl": "https://www.search.com/",
"RandomEndpoint": "api/random",
"AuthToken": "sometoken"
}
}
然后我创建 C# 类来表示配置部分。
public class SmtpSettings
{
public string Host { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public int Port { get; set; }
}
public class DbSettings
{
public string ConnectionString { get; set; }
}
public class ProductApiSettings
{
public string BaseUrl { get; set; }
public string AuthEndpoint { get; set; }
public string ClientId { get; set; }
public string ClientSecret { get; set; }
}
public class SearchApiSettings
{
public string BaseUrl { get; set; }
public string RandomEndpoint { get; set; }
public string AuthToken { get; set; }
}
现在,我在 Program.cs 文件中构建创建 HostBuilder 时将这些 JSON 文件添加到配置构建器中。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureAppConfiguration((builder) => {
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile("apisettings.json")
.AddEnvironmentVariables();
});
webBuilder.UseStartup<Startup>();
});
上面的代码会将 json 配置文件添加到配置生成器并构建配置。
我现在可以检索配置部分并将它们转换为 C# 类并使用配置值。在下面的代码中,我正在访问类ConfigureServices
方法中的配置部分及其值Startup
。
// 这个方法被运行时调用。使用此方法向容器添加服务。
public void ConfigureServices(IServiceCollection services)
{
// Get DbSettings section from the configuration file.
var dbSettingSection = Configuration.GetSection("DbSettings");
// Get Configuration value and convert it to C# class object.
var dbSettings = dbSettingSection.Get<DbSettings>();
// Now I can access ConnectionString value from the configuration by accessing dbSettings.ConnectionString
//Same as above, get ProductApi Section from the configuration file.
var productApiSection = Configuration.GetSection("ProductApi");
// Get the configuartion value and convert it to C# class object.
var productApiSettings = productApiSection.Get<ProductApiSettings>();
var smtpSection = Configuration.GetSection("SmtpSettings");
var smtpSettings = smtpSection.Get<SmtpSettings>();
var searchApiSection = Configuration.GetSection("SearchApi");
var searchApiSettings = searchApiSection.Get<SearchApiSettings>();
var authToken = Configuration["SearchApi:AuthToken"];
services.AddControllersWithViews();
}
您还可以将这些配置部分作为依赖项注入应用程序的其他部分,例如控制器或服务类。
为此,您需要将配置部分添加到服务集合中,以便将它们解析为依赖项。更改 ConfigureService 方法如下。
public void ConfigureServices(IServiceCollection services)
{
var dbSettingSection = Configuration.GetSection("DbSettings");
// Add the section to service collection.
services.Configure<DbSettings>(dbSettingSection);
var productApiSection = Configuration.GetSection("ProductApi");
services.Configure<ProductApiSettings>(productApiSection);
var smtpSection = Configuration.GetSection("SmtpSettings");
services.Configure<SmtpSettings>(smtpSection);
var searchApiSection = Configuration.GetSection("SearchApi");
services.Configure<SearchApiSettings>(searchApiSection);
services.AddControllersWithViews();
}
现在我可以依赖ProductApi
于我的 HomeController 中的配置部分,如下所示。
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
// Field for ProductApiSettings
private ProductApiSettings _productApiSettings;
public HomeController(IOptions<ProductApiSettings> productsApiSettings, Logger<HomeController> logger)
{
_logger = logger;
// Initilizing settings object from the dependency.
// This will have the values retrieved from the json config files.
_productApiSettings = productsApiSettings.Value;
}
public IActionResult Index()
{
// Using properties from the settings
var productApiAuthURL = _productApiSettings.BaseUrl + _productApiSettings.AuthEndpoint;
return View();
}
}
我希望这能帮助你解决你的问题。
推荐阅读
- database - 在informix中加载信息时属性错误
- iis - 在本地 IIS 中启用 HTTP2 以进行 CSS 预加载
- entity-framework - SQLite 实体框架代码优先:哪个 Nuget 包?
- airflow - 如何从 Apache Airflow 触发 azure Databricks 笔记本
- karate - 有没有办法捕捉空手道呼叫的请求和响应?
- angular - 单击 ngFor 内的链接时没有任何反应
- c++ - 用 boost::geometry 扩展多边形?
- javascript - React Router 更改 URL 但不更新页面,除非它从浏览器刷新
- windows - 对最近 N 小时内修改的文件运行批处理脚本
- javascript - 我想在这个对象数组中过滤年龄超过 30 岁