我试图将命令行参数传递给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
。
答案 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;