Olu*_*emi 199 .net c# .net-core asp.net-core
我在appsettings/Config .json中设置了我的AppSettings数据,如下所示:
{
"AppSettings": {
"token": "1234"
}
}
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了如何从.json文件中读取AppSettings值,但我无法获得任何有用的信息.
我试过了:
var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null
Run Code Online (Sandbox Code Playgroud)
我知道在ASP.NET 4.0中你可以这样做:
System.Configuration.ConfigurationManager.AppSettings["token"];
Run Code Online (Sandbox Code Playgroud)
但是我如何在ASP.NET Core中执行此操作?
Yuv*_*kov 273
这有几个曲折.我已经修改了这个答案,以便与ASP.NET Core 2.0保持同步(截至26/02/2018).
这主要来自官方文档:
要在ASP.NET应用程序中使用设置,建议您仅Configuration
在应用程序的Startup
类中实例化a .然后,使用"选项"模式访问各个设置.假设我们有一个appsettings.json
看起来像这样的文件:
{
"MyConfig": {
"ApplicationName": "MyApp",
"Version": "1.0.0"
}
}
Run Code Online (Sandbox Code Playgroud)
我们有一个代表配置的POCO对象:
public class MyConfig
{
public string ApplicationName { get; set; }
public int Version { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我们构建配置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();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,appsettings.json
将被默认为注册在.NET 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"));
}
Run Code Online (Sandbox Code Playgroud)
我们这样注入:
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);
}
Run Code Online (Sandbox Code Playgroud)
全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"));
}
}
Run Code Online (Sandbox Code Playgroud)
hug*_*hug 59
首先:Microsoft.Framework.ConfigurationModel的程序集名称和命名空间已更改为Microsoft.Framework.Configuration.所以你应该使用:例如
"Microsoft.Framework.Configuration.Json": "1.0.0-beta7"
Run Code Online (Sandbox Code Playgroud)
作为一个依赖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();
}
Run Code Online (Sandbox Code Playgroud)
如果您想从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);
});
}
Run Code Online (Sandbox Code Playgroud)
或者您可以创建一个名为AppSettings的类,如下所示:
public class AppSettings
{
public string token { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并配置如下服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<MvcOptions>(options =>
{
//mvc options
});
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}
Run Code Online (Sandbox Code Playgroud)
然后通过例如这样的控制器访问它:
public class HomeController : Controller
{
private string _token;
public HomeController(IOptions<AppSettings> settings)
{
_token = settings.Options.token;
}
}
Run Code Online (Sandbox Code Playgroud)
MDM*_*313 46
对于.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"));
}
Run Code Online (Sandbox Code Playgroud)
我的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() { }
}
}
Run Code Online (Sandbox Code Playgroud)
配置实际上是我appsettings.json
文件的一个子部分,名为AzureStorageConfig
:
{
"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"
}
}
Run Code Online (Sandbox Code Playgroud)
我唯一要补充的是,由于构造函数已经改变,我还没有测试是否需要为它加载一些额外的东西appsettings.<environmentname>.json
而不是appsettings.json
.
Ale*_* S. 41
.NET 核心 3.0
也许这不是从appsettings.json获取值的最佳方法,但它很简单,并且可以在我的应用程序中使用!!
{
"ConnectionStrings": {
"DefaultConnection":****;"
}
"AppSettings": {
"APP_Name": "MT_Service",
"APP_Version": "1.0.0"
}
}
Run Code Online (Sandbox Code Playgroud)
在上面:
using Microsoft.Extensions.Configuration;
Run Code Online (Sandbox Code Playgroud)
在您的代码中:
var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];
Run Code Online (Sandbox Code Playgroud)
kod*_*bot 23
如果您只想获取令牌的值,请使用
Configuration["AppSettings:token"]
小智 19
使用Core 2.2,并以最简单的方式...
public IActionResult Index([FromServices] IConfiguration config)
{
var myValue = config.GetValue<string>("MyKey");
}
Run Code Online (Sandbox Code Playgroud)
appsettings.json
通过构造函数或动作注入自动加载并可用,并且也有一个GetSection
方法IConfiguration
。无需更改,Startup.cs
或者Program.cs
您所需要做的只是appsettings.json
。
Ogg*_*las 13
对于 ASP.NET Core 3.1,您可以遵循以下文档:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1
当您创建新的 ASP.NET Core 3.1 项目或 .NET 5 项目时,您将在以下配置行中看到Program.cs
:
Host.CreateDefaultBuilder(args)
Run Code Online (Sandbox Code Playgroud)
这可以实现以下功能:
这意味着您可以IConfiguration
使用字符串键注入和获取值,甚至是嵌套值。喜欢IConfiguration ["Parent:Child"];
例子:
appsettings.json
{
"ApplicationInsights":
{
"Instrumentationkey":"putrealikeyhere"
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Teo*_*ahi 10
以下适用于Console Apps;
1-安装以下nuget
packages(.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>
Run Code Online (Sandbox Code Playgroud)
2- appsettings.json
在根级别创建.右键单击它并"复制到输出目录"为" 如果更新则复制 ".
3-示例配置文件:
{
"AppConfig": {
"FilePath": "C:\\temp\\logs\\output.txt"
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Md *_*iar 10
您可以简单地使用...
var configurations = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var db3 = configurations["ConnectionStrings:BookStoresDB2"];
Run Code Online (Sandbox Code Playgroud)
private readonly ILogger<WeatherForecastController> _logger;
private IConfiguration _configuration;
public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
//You can use any of these
var db = _configuration.GetSection("ConnectionStrings").GetSection("BookStoresDB2").Value;
var db1 = _configuration["ConnectionStrings:BookStoresDB2"];
var db2 = _configuration.GetValue<string>("ConnectionStrings:BookStoresDB2");
}
Run Code Online (Sandbox Code Playgroud)
这是 ASP.NET Core 的完整用例!
文章.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": "..."
},
]
}
Run Code Online (Sandbox Code Playgroud)
文章容器.cs
{
"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": "..."
},
]
}
Run Code Online (Sandbox Code Playgroud)
启动文件
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; }
}
Run Code Online (Sandbox Code Playgroud)
索引.cshtml.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);
}
}
Run Code Online (Sandbox Code Playgroud)
索引.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;
}
}
Run Code Online (Sandbox Code Playgroud)
对于ASP.NET Core 6.0,您可以简单地:
应用程序设置.json
{
"AppSettings": {
"Token": "1234"
}
}
Run Code Online (Sandbox Code Playgroud)
测试模型.cs
using Microsoft.Extensions.Configuration
public class TestModel : PageModel
{
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myToken = Configuration["AppSettings:Token"];
return Content($"myToken value: {myToken}");
}
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这是个好习惯,但它在本地有效。如果在发布/部署(到IIS Web服务)时失败,我将对其进行更新。
第1步-将此程序集添加到类的顶部(在我的情况下为控制器类):
using Microsoft.Extensions.Configuration;
Run Code Online (Sandbox Code Playgroud)
第2步-添加此内容或类似内容:
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json").Build();
Run Code Online (Sandbox Code Playgroud)
步骤3-通过执行以下操作来调用密钥的值(返回字符串):
config["NameOfYourKey"]
Run Code Online (Sandbox Code Playgroud)
小智 7
只是为了补充尤瓦尔·伊茨查科夫的答案。
您可以不使用构建器功能来加载配置,而只需注入它即可。
public IConfiguration Configuration { get; set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
Run Code Online (Sandbox Code Playgroud)
对于.NET Core 2.0,您可以简单地:
在appsettings.json中声明您的键/值对:
{
"MyKey": "MyValue"
}
Run Code Online (Sandbox Code Playgroud)
在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);
});
Run Code Online (Sandbox Code Playgroud)
.NET 核心 2.1.0
Run Code Online (Sandbox Code Playgroud)var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
var config = builder.Build();
Run Code Online (Sandbox Code Playgroud)
3.安装以下依赖:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json
Run Code Online (Sandbox Code Playgroud)
4. 然后,重要提示:
右键单击 appsettings.json 文件 -> 单击属性 -> 选择如果更新则复制:
最后,你可以这样做:
配置[“key1”]
考虑到我的配置文件如下所示:
Run Code Online (Sandbox Code Playgroud){ "ConnectionStrings": "myconnection string here", "key1": "value here" }
这对我有用 .Net 5
我有一个 appsettings.development.json 文件。我选择了“开发”环境,这就是我在 development.json 文件中设置的原因。您可以在默认环境下使用 appsettings.josn。
有了这个配置
创建了一个具有配置属性的类
在 Startup 中注册我的电话
我现在可以在我的控制器中访问
除了现有的答案,我想提一提,有时可能是有用的扩展方法用于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;
}
}
Run Code Online (Sandbox Code Playgroud)
它节省了很多行,而您只需要编写干净且最少的代码即可:
...
x.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
ValidateLifetime = true,
IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
ValidAudience = _configuration.GetValidAudience(),
ValidIssuer = _configuration.GetValidIssuer()
};
Run Code Online (Sandbox Code Playgroud)
也可以将IConfiguration
实例注册为单例并将其注入到您需要的任何地方-我使用Autofac容器,方法如下:
var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)
您可以对MS依赖注入执行相同的操作:
services.AddSingleton<IConfigurationRoot>(appConfiguration);
Run Code Online (Sandbox Code Playgroud)
小智 6
聚会超级迟到,但如果有人发现了这一点。
你可以从 Microsoft.Extensions.Configuration 调用 IConfiguration;
public static IConfiguration Configuration { get; }
public static string MyAwesomeString = Configuration.GetSection("appSettings")["MyAwesomeString"].ToString();
Run Code Online (Sandbox Code Playgroud)
他们只是不断地改变事情-更新了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();
}
Run Code Online (Sandbox Code Playgroud)
我一直想念这行!
.SetBasePath(env.ContentRootPath)
Run Code Online (Sandbox Code Playgroud)
.NET Core 2.2 方式
(毫无疑问,微软将在下一个 .NET 版本中再次将其更改为完全不同的内容。)
它可能看起来像这样。这里我们将加载Setting1和Setting2
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"Setting1": "abc",
"Setting2": 123
}
Run Code Online (Sandbox Code Playgroud)
POCO类保存Setting1 和Setting2 。我们将把 appsettings.json 加载到此类对象中。POCO 类的结构应与 JSON 文件匹配,如果需要,属性可以嵌套在其他属性/类中。
public class AppSettings
{
public string Setting1 { get; set; }
public int Setting2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
将 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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
244858 次 |
最近记录: |