.Net 6 config.GetSection() 未按预期运行

.Net 6 config.GetSection() does not act as expected

我正在尝试获取 .net 6 项目中的配置部分,我遇到的问题是 GetSection() 没有按预期运行,它没有 return 该部分,它只是空的。这是一些代码片段:

public static IServiceCollection AddServices(this IServiceCollection services, IConfiguration config)
{
    var e = config["EmailConfig"];
    var s = config.GetSection("EmailConfig:Server");
    IConfigurationSection emailConfigSection = config.GetSection(EmailConfig.Name);
    services.Configure<EmailConfig>(emailConfigSection);

    return services;
}

EmailConfig.Name 是常数,等于 "EmailConfig"

变量值看起来如下e = nulls = "server"emailConfigSection = null,那是什么原因呢?为什么我不能得到完整的部分

appsettings.json 如果需要:

{
 "EmailConfig": {
    "Server": "server",
    "Port": 587,
    "UseSSL": true,
    "Username": "name",
    "Password": "password",
    "DefaultSender": "sender"
  }
}

如果您为 EmailConfig 定义了模型 class,请使用以下代码。

IConfigurationSection emailConfigSection = config.GetSection(EmailConfig.Name).Get<EmailConfig>();

否则您需要从其 属性 名称中获取键值,如下所示:

IConfigurationSection emailConfigSection = config.GetSection(EmailConfig.Name);
var server = emailConfigSection["Server"];
var port = emailConfigSection["Port"];
....

您需要做的:

var e = config.GetSection("EmailConfig");

没有

var e = config["EmailConfig"];

这里有一个更详细的方法来获得你想要的结果。

//这在运行时被调用 Startup.cs

Public Class Startup 
{

   private readonly IConfiguration _configuration;

   public Startup(IConfiguration configuration)
   {
      _configuration = configuration;
   }

   public void ConfigureServices(IServiceCollection services)
   {
       //set up config
       services.AddOptions();
       services.Configure<EmailConfig> (_configuration.GetSection("EmailConfig"));
   }

}

我们可以创建一个模型来稍后访问我们的配置(EmailConfig)

    public class EmailConfig
    {
        public string Server { get; set; }
        public int Port { get; set; }
        public bool UseSSL { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string DefaultSender { get; set; }
    }

稍后获取您的配置值: 假设我们需要访问服务器

Public class TestApi
{
     private readonly EmailConfig _emailConfig
     
     public TestApi(IOptions<EmailConfig) emailConfig)
     {
        _emailConfig = emailConfig.Value
     }

     public string ReturnServer
     {
        var serverName = _emailConfig.Server;
        return serverName;
     }
}