首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >configuration.getValue或configuration.getsection总是返回null

configuration.getValue或configuration.getsection总是返回null
EN

Stack Overflow用户
提问于 2018-12-29 16:46:21
回答 6查看 17.1K关注 0票数 6

我是.Net核心的新手,我试图从appsettings.json文件中获得一个值,但是我忽略了一些非常基本的东西。请告诉我我做错了什么..。这是密码..。

Program.cs

代码语言:javascript
复制
 WebHost.CreateDefaultBuilder(args)
 .ConfigureAppConfiguration((hostingContext, config) =>
 {
      config.SetBasePath(Directory.GetCurrentDirectory());
 })

Startup.cs

代码语言:javascript
复制
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
}

网络API控制器

代码语言:javascript
复制
private readonly IConfiguration config;

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

动作法

代码语言:javascript
复制
var emailTemplatesRelativePath = config.GetSection("EmailSettings");
var email = config.GetValue<string>("Email");

以上两行都返回GetSectionGetValue的空值。

appsettings.json

代码语言:javascript
复制
{
  "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"
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-01-02 21:37:20

在IIS (或inside )中承载在制品时,Directory.GetCurrentDirectory()将返回运行程序外时返回的不同路径。直到IISCore2.1之前,基于IISCore2.2的主机始终处于进程之外,但ASP.NET Core2.2引入了运行进程内(这是创建新项目时的默认功能)的能力。

当进程耗尽时,Directory.GetCurrentDirectory()将返回到您的ASP.NET核心应用程序本身的路径,而在运行进程中时,它将返回到itself的路径(或者itself)。"C:\Program \IIS Express")。

根据你的问题,有关守则如下:

代码语言:javascript
复制
WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        config.SetBasePath(Directory.GetCurrentDirectory());
    })

在这里,在调用SetBasePath之前,IConfigurationBuilder已经设置为使用正确的路径。您的调用本身正在覆盖此路径,将其设置为。"C:\Program \IIS Express“。使用此重写的基路径,您的appsettings.json等文件将不再被找到,因为它们不存在于。"C:\Program \IIS“,因此没有从这些文件中加载任何配置。

解决方案只是删除对ConfigureAppConfiguration的调用,这样基路径就不会被覆盖。我知道你已经发现了这件事,但我想确保你对这里出了什么问题有一个解释。

票数 4
EN

Stack Overflow用户

发布于 2018-12-29 17:48:08

访问Controller中的配置与在Startup.cs中的工作方式略有不同。我在前一段时间就这样做了,只需遵循以下步骤:

Nuget: Microsoft.Extensions.Configuration.Binder

将您想在Controller中访问的所有配置放在一个部分中。"EmailSettings":

appsettings.json

代码语言:javascript
复制
{
  "EmailSettings": {
    "EmailTemplatesPath": "EmailTemplates",
    "Email": "aa@aa.com"
  }
}

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

EmailSettings.cs

代码语言:javascript
复制
public class EmailSettings
{
    public string EmailTemplatesPath { get; set; }
    public string Email { get; set; }
}

然后将Config值绑定到EmailSettings类的Startup.cs实例,并将该对象添加到依赖项注入容器中:

Startup.cs

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    ...
    EmailSettings emailSettings = new EmailSettings();
    Configuration.GetSection("EmailSettings").Bind(emailSettings);
    services.AddSingleton(emailSettings);
}

现在,您可以在Api Controller中请求您的配置,只需将其添加到构造器中,如下所示:

网络API控制器

代码语言:javascript
复制
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    EmailSettings _emailSettings;

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

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

票数 7
EN

Stack Overflow用户

发布于 2018-12-29 18:17:59

你犯了一个简单的错误,忘了在"EmailSettings“中添加”电子邮件“。更新您的json,如下所示,并获得带有config.GetSection("EmailSettings")["Email"];的电子邮件

代码语言:javascript
复制
"EmailSettings": {
    "EmailTemplatesPath": "EmailTemplates",
    "Email": "aa@aa.com"
  },

希望这能解决你的问题。

编辑:

如果要将这些值从inject获取到启动以外的任何内容,则应将这些配置值加载到设置类中,然后将appropiate实例注入要在其中使用这些设置的方法构造函数。要做到这一点,请看我的答案这里

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53971432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档