Значение AppSettings всегда пустое ядро - PullRequest
0 голосов
/ 18 октября 2018

У меня проблема при попытке получить значения из файла json и привязать их к классу JwtSettings с помощью класса IOptions <>, но каждый раз, когда значение равно нулю или 0 класс запуска:

 public class Startup
{
    private readonly IOptions<JwtSettings> _settings;

    public Startup(IConfiguration configuration, IOptions<JwtSettings> settings)
    {
        Configuration = configuration;
        _settings = settings;
    }

    public IConfiguration Configuration { get; }

    public IContainer ApplicationContainer { get; private set; } 

    // This method gets called by the runtime. Use this method to add services to the container.
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddOptions();
        services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
        services.AddJwt(_settings);
        var builder = new ContainerBuilder();
        //register commandModules 
        builder.Populate(services);
        builder.RegisterModule(new ContainerModules(Configuration));
        ApplicationContainer = builder.Build();

        return new AutofacServiceProvider(ApplicationContainer);
    }

Метод расширений при использовании параметров:

        public static void AddJwt(this IServiceCollection services, IOptions<JwtSettings> setting)
    {
        IConfiguration configuration;
        using (var serviceProvider = services.BuildServiceProvider())
        {
            configuration = serviceProvider.GetService<IConfiguration>();
        }
        services.AddAuthentication(o =>
            {
                o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(cfg =>
            {
                cfg.TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.Value.Key)),
                    ValidIssuer = setting.Value.Issuer,
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidateIssuerSigningKey = true,
                    ValidateLifetime = true
                };
            });
    }

В классе программы i Добавить вызов ConfigureAppConfiguration при создании веб-хоста для указания конфигурации приложения

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false);
                config.AddCommandLine(args);
            })
            .UseStartup<Startup>();

Параметры приложения json выглядятчто: enter image description here

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Параметр конструктора IOptions<JwtSettings> не заполняется в то время, как вы думаете.Когда вызывается конструктор, метод ConfigureServices не был выполнен, поэтому каркасу не нужно ничего вставлять в конструктор, кроме значения по умолчанию JwtSettings.

Даже когда вы вызываете services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));, это не заполняет IOptions<JwtSettings>, потому что оно уже было введено в конструктор - каркас не обновляет или повторно вводит значение.Это означает, что вы должны сами прочитать настройки в ConfigureServices (или свой метод расширения) и затем использовать значения.например,

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));

    services.AddJwt(Configuration);

    services
        .AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}


public static void AddJwt(this IServiceCollection services, IConfiguration configuration)
{
    var settings = configuration.GetSection("JwtSettings").Get<JwtSettings>();

    ....
}

Как только метод ConfigureServices будет завершен, вы можете добавить IOptions<JwtSettings> в контроллеры / службы, и он будет заполнен.

Я знаю, что это не так чисто, как использованиепараметр IOptions<JwtSettings>, но вы пытаетесь использовать систему DI до ее инициализации, поэтому на данном этапе вам необходимо прочитать настройки вручную.

0 голосов
/ 18 октября 2018

Я не видел, читаете ли вы свои конфигурации из вашего appsettings.json.Где вы это указали?Примерно так:

var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();

 Configuration = builder.Build();

Если у вас более одного набора приложений.Например, (appsettings.Development.json), Prod и т. Д.

  var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();

, вам необходимо проверить переменную среды для вашего приложения.Ваша IConfiguration должна взять оттуда разделы

enter image description here

Если у вас есть, например, развернутый на вашем IIS, проверьте здесь:

enter image description here

enter image description here

...