ama*_*man 124 c# asp.net-core-mvc asp.net-core
不知道我在这里缺少什么,但我无法从我的.net核心应用程序中的appsettings.json获取值.我的appsettings.json为:
{
"AppSettings": {
"Version": "One"
}
}
Run Code Online (Sandbox Code Playgroud)
启动:
public class Startup
{
private IConfigurationRoot _configuration;
public Startup(IHostingEnvironment env)
{
_configuration = new ConfigurationBuilder()
}
public void ConfigureServices(IServiceCollection services)
{
//Here I setup to read appsettings
services.Configure<AppSettings>(_configuration.GetSection("AppSettings"));
}
}
Run Code Online (Sandbox Code Playgroud)
模型:
public class AppSettings
{
public string Version{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public class HomeController : Controller
{
private readonly AppSettings _mySettings;
public HomeController(IOptions<AppSettings> settings)
{
//This is always null
_mySettings = settings.Value;
}
}
Run Code Online (Sandbox Code Playgroud)
_mySettings永远是空的.这里有什么我想念的吗?
Dav*_*ang 155
你不需要IConfiguration在Startup构造函数中使用new .其实施将由DI系统注入.
// Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
// Startup.cs
public class Startup
{
public IHostingEnvironment HostingEnvironment { get; private set; }
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
this.HostingEnvironment = env;
this.Configuration = configuration;
}
}
Run Code Online (Sandbox Code Playgroud)
// Program.cs
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
}
//Startup.cs
public class Startup
{
public IConfigurationRoot Configuration { get; private set; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
...
}
Run Code Online (Sandbox Code Playgroud)
如果使用类库将解决方案分成多个项目,Microsoft.Extensions.Options.ConfigurationExtensions包可以方便地读取Startup文件中的值并将它们注入项目中的配置类.
它有2个扩展你可以使用:
{
"ConnectionStrings": {
...
},
"AppIdentitySettings": {
"User": {
"RequireUniqueEmail": true
},
"Password": {
"RequiredLength": 6,
"RequireLowercase": true,
"RequireUppercase": true,
"RequireDigit": true,
"RequireNonAlphanumeric": true
},
"Lockout": {
"AllowedForNewUsers": true,
"DefaultLockoutTimeSpanInMins": 30,
"MaxFailedAccessAttempts": 5
}
},
"Recaptcha": {
...
},
...
}
Run Code Online (Sandbox Code Playgroud)
我将所有与安全相关的服务ConfigurationBuilder.GetValue<T>用于其自己的项目中appsettings.json.
appsettings.json中的安全设置
我定义了名为"AppIdentitySettings"的配置,用于我想IConfiguration在我的web/start-up项目框架中设置的身份选项.
public class AccountController : Controller
{
private readonly IConfiguration _config;
public AccountController(IConfiguration config)
{
_config = config;
}
[AllowAnonymous]
public IActionResult ResetPassword(int userId, string code)
{
var vm = new ResetPasswordViewModel
{
PasswordRequiredLength = _config.GetValue<int>(
"AppIdentitySettings:Password:RequiredLength"),
RequireUppercase = _config.GetValue<bool>(
"AppIdentitySettings:Password:RequireUppercase")
};
return View(vm);
}
}
Run Code Online (Sandbox Code Playgroud)
配置类
然后,您需要定义配置类,它们只是POCO,用于表示您的配置结构ConfigurationBuilder.GetValue<T>.配置类的名称不必与您在其中定义的节名称匹配IOptions<T>,而是需要匹配的属性名称.
public class AppIdentitySettings
{
public UserSettings User { get; set; }
public PasswordSettings Password { get; set; }
public LockoutSettings Lockout { get; set; }
}
public class UserSettings
{
public bool RequireUniqueEmail { get; set; }
}
public class PasswordSettings
{
public int RequiredLength { get; set; }
public bool RequireLowercase { get; set; }
public bool RequireUppercase { get; set; }
public bool RequireDigit { get; set; }
public bool RequireNonAlphanumeric { get; set; }
}
public class LockoutSettings
{
public bool AllowedForNewUsers { get; set; }
public int DefaultLockoutTimeSpanInMins { get; set; }
public int MaxFailedAccessAttempts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
扩展方法
您可以ConfigureServices()在IOptions<AppIdentitySettings>Web项目中配置与这些配置类之间的绑定.但我更喜欢在单独的项目中定义扩展方法,以便您可以即插即用.
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
...
namespace DL.SO.UI.Web
{
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
var identitySettingsSection =
_configuration.GetSection("AppIdentitySettings");
services.Configure<AppIdentitySettings>(identitySettingsSection);
...
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
插入主要启动
public class AccountController : Controller
{
private readonly AppIdentitySettings _appIdentitySettings;
public AccountController(IOptions<AppIdentitySettings> appIdentitySettingsAccessor)
{
_appIdentitySettings = appIdentitySettingsAccessor.Value;
}
[AllowAnonymous]
public IActionResult ResetPassword(int userId, string code)
{
var vm = new ResetPasswordViewModel
{
PasswordRequiredLength = _appIdentitySettings.Password.RequiredLength,
RequireUppercase = _appIdentitySettings.Password.RequireUppercase
};
return View(vm);
}
}
Run Code Online (Sandbox Code Playgroud)
您需要告诉IConfiguration加载appsettings文件.
// Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
// Startup.cs
public class Startup
{
public IHostingEnvironment HostingEnvironment { get; private set; }
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
this.HostingEnvironment = env;
this.Configuration = configuration;
}
}
Run Code Online (Sandbox Code Playgroud)
// Program.cs
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
}
//Startup.cs
public class Startup
{
public IConfigurationRoot Configuration { get; private set; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
...
}
Run Code Online (Sandbox Code Playgroud)
谢谢@Kirk指出来了!
Ase*_*tam 44
添加David Liang对Core 2.0的回答-
appsettings.json文件链接到ASPNETCORE_ENVIRONMENT变量.
ASPNETCORE_ENVIRONMENT可以设置为任意值,但三个值支持的框架:Development,Staging,和Production.如果ASPNETCORE_ENVIRONMENT未设置,则默认为Production.
对于这三个值,这些appsettings.ASPNETCORE_ENVIRONMENT.json文件都支持开箱即用- appsettings.Staging.json,appsettings.Development.json和appsettings.Production.json
以上三个应用程序设置json文件可用于配置多个环境.
示例 - appsettings.Staging.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"System": "Information",
"Microsoft": "Information"
}
},
"MyConfig": "My Config Value for staging."
}
Run Code Online (Sandbox Code Playgroud)
使用Configuration["config_var"]检索任何配置值.
public class Startup
{
public Startup(IHostingEnvironment env, IConfiguration config)
{
Environment = env;
Configuration = config;
var myconfig = Configuration["MyConfig"];
}
public IConfiguration Configuration { get; }
public IHostingEnvironment Environment { get; }
}
Run Code Online (Sandbox Code Playgroud)
sha*_*jji 40
只需创建一个AnyName.cs文件并粘贴以下代码即可.
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
namespace Custom
{
static class ConfigurationManager
{
public static IConfiguration AppSetting { get; }
static ConfigurationManager()
{
AppSetting = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("YouAppSettingFile.json")
.Build();
}
}
}
Run Code Online (Sandbox Code Playgroud)
必须用您的文件名替换YouAppSettingFile.json文件名.
您的.json文件应如下所示.
{
"GrandParent_Key" : {
"Parent_Key" : {
"Child_Key" : "value1"
}
},
"Parent_Key" : {
"Child_Key" : "value2"
},
"Child_Key" : "value3"
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用它了.
不要忘记在您要使用的班级中添加参考.
using Custom;
Run Code Online (Sandbox Code Playgroud)
用于检索值的代码.
string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];
Run Code Online (Sandbox Code Playgroud)
har*_*eyt 24
我想最简单的方法是DI.进入Controller的一个例子.
// StartUp.cs
public void ConfigureServices(IServiceCollection services)
{
...
// for get appsettings from anywhere
services.AddSingleton(Configuration);
}
public class ContactUsController : Controller
{
readonly IConfiguration _configuration;
public ContactUsController(
IConfiguration configuration)
{
_configuration = configuration;
// sample:
var apiKey = _configuration.GetValue<string>("SendGrid:CAAO");
...
}
}
Run Code Online (Sandbox Code Playgroud)
Abh*_*dey 22
假设 appsettings.json 中有这样的值。
"MyValues": {
"Value1": "Xyz"
}
Run Code Online (Sandbox Code Playgroud)
方法一:不使用依赖注入
在 .cs 文件中:
static IConfiguration conf = (new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build());
public static string myValue1= conf["MyValues:Value1"].ToString();
Run Code Online (Sandbox Code Playgroud)
方法2:使用依赖注入(推荐)
在 Startup.cs 文件中:
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
...
services.AddServices(Configuration);
}
Run Code Online (Sandbox Code Playgroud)
在你的控制器中:
public class TestController : ControllerBase
{
private string myValue1 { get; set; }
public TestController(IConfiguration configuration)
{
this.myValue1 = configuration.GetValue<string>("MyValues:Value1");
}
}
Run Code Online (Sandbox Code Playgroud)
在Startup类的构造函数中,您可以使用注入的IConfiguration对象访问appsettings.json和许多其他设置:
Startup.cs构造函数
public Startup(IConfiguration configuration)
{
Configuration = configuration;
//here you go
var myvalue = Configuration["Grandfather:Father:Child"];
}
public IConfiguration Configuration { get; }
Run Code Online (Sandbox Code Playgroud)
appsettings.json的内容
{
"Grandfather": {
"Father": {
"Child": "myvalue"
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
public static void GetSection()
{
Configuration = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json")
.Build();
string BConfig = Configuration.GetSection("ConnectionStrings")["BConnection"];
}
Run Code Online (Sandbox Code Playgroud)
对于 ASP.NET Core 3.1,您可以遵循以下指南:
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1
当您创建新的 ASP.NET Core 3.1 项目时,您将在 中具有以下配置行Program.cs:
Host.CreateDefaultBuilder(args)
Run Code Online (Sandbox Code Playgroud)
这可以实现以下功能:
IConfiguration这意味着您可以使用字符串键注入和获取值,甚至是嵌套值。喜欢IConfiguration["Parent:Child"];
例子:
应用程序设置.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)
小智 5
.NET核心3.X
无需创建新模型并在 Startup.cs 中进行设置。
控制器添加新包 - 使用 Microsoft.Extensions.Configuration;
public class HomeController : Controller
{
private readonly IConfiguration _mySettings;
public HomeController (IConfiguration mySettings)
{
_mySettings= mySettings;
}
//ex: you can get value on below function
public IEnumerable<string> Get()
{
var result = _config.GetValue<string>("AppSettings:Version"); // "One"
return new string[] { result.ToString() };
}
}
Run Code Online (Sandbox Code Playgroud)