【问题标题】:DotNet Core IConfiguration.GetSection is newDotNet Core IConfiguration.GetSection 是新的
【发布时间】:2020-07-13 21:40:12
【问题描述】:

我的应用程序正在运行,我能够从 appsettings.json 获取值,当我不得不更改项目的文件结构时,我不再能够获取配置详细信息。

我的配置文件 (appsettings.json) 如下所示:

{ "Jwt": { "Key":"bs::", "Issuer":"SomeIssuer" } }

注意:这只是“Jwt”部分。

当我打电话时:

var jwtConfig = Configuration.GetSection("Jwt");
jwtConfig["Key"];

jwtConfig 值为空。我也试过了:

Configuration.GetSection("Jwt:Key").Value

但没有运气。

当我运行“dotnet run watch”时,一切正常。但是如果我尝试使用 vs 代码进行调试,我会收到一条错误消息,指出字符串为空。

我的 Program.cs 文件:

    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {
                var context = services.GetRequiredService<DataContext>();
                context.Database.Migrate();
                Seed.SeedUsers(context);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occured during migration.");
            }
        }
        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(WebBuilder => {
            WebBuilder.UseStartup<Startup>();
        });

Startup.cs 文件中的相关行:

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<DataContext>(x =>
        {
            x.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
        });
        services.AddControllers();
        services.AddCors();


        var jwtConfig = Configuration.GetSection("Jwt");
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options => {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtConfig["Key"])),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

提前致谢。

【问题讨论】:

  • 其他设置呢?它们是空的还是只是这个?
  • @PeterCsala,我使用 appsettings.json 的 Jwt 部分编辑了帖子。
  • 你检查过Configuration.Providers下是否列出了对应的json文件吗?您应该寻找JsonConfigurationProvider,其中Source 应该是PhysicalFileProvider,它的Path 应该指向正确的asppsettings.json 文件。 (在 VS 中调试时很容易检查)
  • @PeterCsal,非常感谢,你帮我解决了我的问题。检查我的 JsonConfigurationProvider 的路径后,我注意到它指向错误的路径,然后我更新了我的 launch.json 文件,将“cwd”值更改为向上两个文件夹。谢谢。
  • 很高兴它对您有所帮助。我留下了一个答案,在那里我更详细地捕捉了这个过程。

标签: .net .net-core


【解决方案1】:

事实证明,ConfigurationProviders 之一配置错误。

您可以通过以下过程在调试时轻松检查:

  1. ConfigureServices 内引用Configuration 对象的那一行放置一个断点。
  2. 启动您的应用程序。
  3. 将鼠标悬停在 Configuration 对象上并打开 Providers 集合
  4. 寻找那些JsonConfigurationProvider 的供应商
  5. 检查这些Source 并寻找PhysicalFileProvider
  6. 检查他们的Path 以指向正确的文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2018-02-11
    相关资源
    最近更新 更多