0

Я пытаюсь передать аргументы командной строки классу Startup. После this пример, я изменил мой Program класс, и это выглядит следующим образом:Почему Startup's IConfigurationRoot имеет значение null?

 var builder = new ConfigurationBuilder() 
      .SetBasePath(Directory.GetCurrentDirectory()) 
      .AddJsonFile("generalsettings.json", optional: false, reloadOnChange: true) 
      .AddEnvironmentVariables(prefix: "ASPNETCORE_") 
      .AddCommandLine(args); 
     var config = builder.Build(); 

     var host = new WebHostBuilder() 
      .UseUrls("http://*:5000") 
      .UseConfiguration(config) 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 

generalsettings.json содержит следующие данные:

{ 
    "Logging": { 
    "IncludeScopes": false, 
    "LogLevel": { 
     "Default": "Debug", 
     "System": "Information", 
     "Microsoft": "Information" 
    } 
    } 
} 

Поэтому я закомментирована по умолчанию Startup класса конструктор. Затем я заметил, что именно здесь назначается IConfigurationRoot Configuration, и поэтому, когда я пытаюсь использовать его с ConfigureServices, он равен нулю. Я пытаюсь использовать (я думаю) конфигурацию, построенную в Program's Main. Что мне здесь не хватает?

UPDATE

Для того, чтобы понять: я пытаюсь использовать args в Startup классе.

+0

Что именно вы пытаетесь достичь здесь. Я чувствую, что то, что я думаю, что вы пытаетесь сделать, может быть выполнено с помощью вашего launchSettings.json. Что должно быть в ваших свойствах для проекта. –

+0

Я пытаюсь использовать 'args' в файле' Startup'. – nicks

ответ

3

Получается, что в этом вопросе было довольно много обсуждений в GitHub Aspnet hosting repo issues area. Репозитории GitHub всегда являются хорошим местом, чтобы посмотреть на интересную проблему, подобную этой.

Чтобы подвести итог для вас, не настраивайте IConfigurationRoot в Program.Main, настройте его в Startup. Вы можете передать аргументы командной строки для конструктора запуска из Program.cs так:

public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .ConfigureServices(services => services 
       .AddSingleton(new ConsoleArgs(args)) 
      ) 
      .Build(); 
     host.Run(); 
    } 

где ConsoleArgs является класс держателя вы можете создать себе, что выглядит следующим образом:

public class ConsoleArgs 
{ 
    public ConsoleArgs(string[] args) 
    { 
     Args = args; 
    } 
    public string[] Args { get; } 
} 

Очевидно, конфигурирование ConsoleArgs услуга - это ключ. Это позволит вставить его в конструктор Startup. Тогда ваш Startup конструктор класса выглядит как

public Startup(IHostingEnvironment env, ConsoleArgs args) 
{ 
    var builder = new ConfigurationBuilder() 
    .SetBasePath(env.ContentRootPath) 
    .AddJsonFile("generalsettings.json", optional: false, reloadOnChange: true) 
    .AddEnvironmentVariables(prefix: "ASPNETCORE_") 
    .AddCommandLine(args.Args); 
    var config = builder.Build(); 
} 

Узор здесь «настраивают вас хостинг программы окружающей среды, настроить ваше приложение в запуске»

+0

, который правильно передал 'args', но на' Configuration = builder.Build(); было выписано исключение: «Формат нераспознанного аргумента: 'asdf'.' (« asdf »- аргумент, который я прошел для тестирования). – nicks

+0

Однако, когда я изменил аргумент на asdf = eee, он скомпилирован в порядке. заключается в том, что аргументы должны быть в формате словаря (ключевого значения)? – nicks

+0

Да, есть некоторые предположения, сделанные при именовании ключей конфигурации. Поскольку ключ/значение, определенное в JSON, переопределяются при добавлении переменной окружения или позиции командной строки, и поскольку все это должно выполняться на нескольких платформах, имена вещей имеют некоторые ограничения. JSON - это древовидная структура, потому что она представляет и объект, но аргументы командной строки и переменные окружения, очевидно, являются просто ключевой простой величиной. Итак, есть немного волшебства, чтобы определить env var, который перегружает значение подобъекта JSON. Подробнее см. Https://github.com/aspnet/Configuration. :-) – GlennSills

Смежные вопросы