为什么Startup的IConfigurationRoot为空?

时间:2016-12-01 18:16:10

标签: asp.net .net configuration asp.net-core kestrel-http-server

我试图将命令行参数传递给Startup类。在this示例之后,我修改了我的Program类,它看起来像这样:

        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课程&#39;构造函数。然后我注意到IConfigurationRoot Configuration被分配的位置,因此,当我尝试从ConfigureServices使用它时,它会为空。我尝试使用(我认为)Program Main内置的配置。我在这里缺少什么?

更新

说清楚:我试图在args课程中使用Startup

1 个答案:

答案 0 :(得分:3)

事实证明,在GitHub Aspnet hosting repo issues area中对这类事情进行了大量讨论。 GitHub存储库总是一个很好的地方来查看像这样的有趣问题。

总结一下,不要在Program.Main中设置IConfigurationRoot,在Startup中进行设置。您可以将命令行参数从Program.cs传递给Startup构造函数,如下所示:

    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();
}

此处的模式是&#34;配置托管环境程序,在启动时配置应用程序&#34;