从.net核心中的appsettings.json获取价值

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

核心2.0

你不需要IConfigurationStartup构造函数中使用new .其实施将由DI系统注入.

Program.cs中

// 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)

Startup.cs

// 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)

核心1.x

您需要告诉IConfiguration加载appsettings文件.

Program.cs中

// 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)

Startup.cs

// 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指出来了!

  • 未来自我注意:“GetValue&lt;T&gt;”方法位于“Microsoft.Extensions.Configuration.Binder”Nuget 包中 (9认同)
  • 好的,对于 .NET Core 3,您需要 Microsoft.Extensions.Options.ConfigurationExtensions 包,它可以正常工作 (4认同)
  • 从全栈.net倒退了多么可怕的一步 (3认同)
  • 您能像片段一样简单吗? (2认同)
  • 可笑的是,我们需要这么多的解释来访问一个简单的应用程序设置...这曾经是 .NET Framework 中的一行。我知道依赖注入通常是一件好事,但在这种情况下,它是一个麻烦而不是一个帮助。这一次,感觉 C# 正在考虑代码,而不是开发人员 - 这一切都有点 Java 的味道 (2认同)

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.jsonappsettings.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)

  • 可以使用Configuration ["MyConfig:SomethingNested"]获取嵌套对象 (6认同)

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)

  • 不要在生产中使用它。这种方法导致了我们的 Web api 中的内存泄漏。如果您使用 netcore,您可以在任何地方注入 IConfiguration,只需查看上面的答案即可。 (6认同)

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)

  • 阅读其他答案,这应该是最好的。 (4认同)

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)


Sha*_*uti 8

在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)

  • 正是“ Configuration [“ Grandfather:Father:Child”]'语法帮助了我。 (2认同)
  • 这是一个出色的答案,结构清晰、切题。良好的沟通 (2认同)

小智 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)

  • 不完整的答案 (5认同)
  • 应该补充的是,你需要**三个**该死的NuGet包才能工作:`Microsoft.Extensions.Configuration`,`Microsoft.Extensions.Configuration.FileExtensions`和`Microsoft.Extensions.Configuration.Json`。我在 .net Core 中得到了整个模块化的东西,但有时你真的需要为每一行代码另一个包...... (5认同)

Ogg*_*las 5

对于 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)

这可以实现以下功能:

  1. ChainedConfigurationProvider :添加现有 IConfiguration 作为源。在默认配置情况下,添加主机配置并将其设置为应用程序配置的第一个源。
  2. appsettings.json 使用 JSON 配置提供程序。
  3. 使用 JSON 配置提供程序的 appsettings.Environment.json。例如,appsettings.Production.json 和 appsettings.Development.json。
  4. 应用程序在开发环境中运行时的应用程序机密。
  5. 使用环境变量配置提供程序的环境变量。
  6. 使用命令行配置提供程序的命令行参数。

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)