c# - configuration.getValue 或 configuration.getsection 始终返回 null

标签 c# .net asp.net-core .net-core asp.net-core-webapi

我是 .Net Core 的新手,正在尝试从 appsettings.json 文件中获取值,但我错过了一些非常基本的东西。请让我知道我做错了什么...... 这是代码...

Program.cs

 WebHost.CreateDefaultBuilder(args)
 .ConfigureAppConfiguration((hostingContext, config) =>
 {
      config.SetBasePath(Directory.GetCurrentDirectory());
 })

Startup.cs

public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
}

网络 API Controller

private readonly IConfiguration config;

public EmailController(IConfiguration configuration)
{
    if (configuration != null)
    {
        config = configuration;
    }
}

操作方法

var emailTemplatesRelativePath = config.GetSection("EmailSettings");
var email = config.GetValue<string>("Email");

以上两行都为 GetSectionGetValue 返回空值

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Information"
    }
  },
  "ConnectionStrings": {
    "FCRContext": "server=xxx;database=xxx;user id=xxx;password=xxx"
  },
  "AllowedHosts": "*",
  "EmailSettings": {
    "EmailTemplatesPath": "EmailTemplates"
  },
  "Email": "aa@aa.com"
}

最佳答案

在 Controller 中访问配置的方式与在 Startup.cs 中略有不同。我前一段时间做过这个,只需按照以下步骤操作:

Nuget: Microsoft.Extensions.Configuration.Binder

把你想在你的Controller中访问的所有配置放到一个Section中,例如“电子邮件设置”:

appsettings.json

{
  "EmailSettings": {
    "EmailTemplatesPath": "EmailTemplates",
    "Email": "aa@aa.com"
  }
}

然后在您的 Web API 项目中创建一个名为 EmailSettings.cs 的类:

EmailSettings.cs

public class EmailSettings
{
    public string EmailTemplatesPath { get; set; }
    public string Email { get; set; }
}

然后将您的配置值绑定(bind)到 Startup.cs 中的 EmailSettings 类的实例,并将该对象添加到依赖注入(inject)容器:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...
    EmailSettings emailSettings = new EmailSettings();
    Configuration.GetSection("EmailSettings").Bind(emailSettings);
    services.AddSingleton(emailSettings);
}

现在您可以通过简单地将配置添加到构造函数来在 Api Controller 中请求您的配置,如下所示:

网络 API Controller

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    EmailSettings _emailSettings;

    public ValuesController(EmailSettings emailSettings)
    {
        _emailSettings = emailSettings;
    }
....
}

刚刚在我当前的项目(.NET Core 2.2 Web Api)中再次尝试,它成功了。我在 ValuesController 构造函数中放置了一个断点,_emailSettings 对象包含来自 appsettings.json 文件的值。你应该能够复制和粘贴这个!玩得开心! :)

关于c# - configuration.getValue 或 configuration.getsection 始终返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53971432/

相关文章:

c# - 如何从 .net 核心后端获取 angular 7 的预渲染 html 页面?

c# - 如何将图像从Unity Android应用程序复制到外部存储?

c# - 如何在 C# 程序中禁用 Microsoft Word 的文件使用框

c# - 如何使用 Roslyn 修改源代码?

c# - 我可以在 .NET 中使用 FileInfo.CopyTo() 显示文件复制进度吗?

asp.net-core - 重复 'System.Reflection.AssemblyInformationalVersionAttribute' 属性

c# - WebSecurity.CreateUserAndAccount "Field does not exist"

c# - 来自另一个进程的 Marshal 位图

c# - 关闭/忽略 xsd 代码生成中指定的字段后缀

azure - 如何通过传入 header 值限制对 Azure Web App 的访问?