将命令行参数传递给ASP Core中的Startup类

时间:2017-07-20 16:05:21

标签: asp.net .net asp.net-core owin katana

我通过命令行传递参数

private static int Main(string[] args)
{

    const string PORT = "12345"    ;

    var listeningUrl = $"http://localhost:{PORT}";

    var builder = new WebHostBuilder()
        .UseStartup<Startup>()
        .UseKestrel()
        .UseUrls(listeningUrl);

    var host = builder.Build();
    WriteLine($"Running on {PORT}");
    host.Run();

    return 0;
}

其中一个参数是日志输出目录。如何将此值输入我的Startup类,以便在收到请求时可以写到此目录?

我想避免使用静态类。提供价值的服务是否是正确的方式?如果是这样,我如何将服务注入我的中间件?

4 个答案:

答案 0 :(得分:14)

您应该可以使用AddCommandLine()扩展程序。首先安装Nuget包Microsoft.Extensions.Configuration.CommandLine并确保输入正确:

using Microsoft.Extensions.Configuration;

现在更新您的Main方法以包含新配置:

var config = new ConfigurationBuilder()
    .AddJsonFile("hosting.json", optional: true) //this is not needed, but could be useful
    .AddCommandLine(args)
    .Build();

var builder = new WebHostBuilder()
    .UseConfiguration(config)  //<-- Add this
    .UseStartup<Startup>()
    .UseKestrel()
    .UseUrls(listeningUrl);

现在您将命令行选项视为配置:

dotnet run /MySetting:SomeValue=123

并阅读代码:

var someValue = Configuration.GetValue<int>("MySetting:SomeValue");

答案 1 :(得分:6)

Dotnet Core 2

您不需要像dotnet core 1.0中的大多数代码来实现此目的。 使用以下语法在构建WebHost时会自动注入AddCommandLine个参数

第1步。

 public static IWebHost BuildWebHost(string[] args)
        {
            return WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
        }

步骤2。使用以下代码使用DI将配置注入Startip.cs

public class Startup
    {
        private readonly IConfiguration Configuration;

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

第3步。使用配置对象访问参数。

 var seed = Configuration.GetValue<bool>("seed");
        Console.WriteLine("seed :" +seed);

第4步。使用参数启动应用程序

 dotnet run seed=True

答案 2 :(得分:4)

DavidG's answer是正确的,但我仍然缺少一些难题。

您需要两个Nuget包:

  1. Microsoft.Extensions.Configuration.Binder
  2. Microsoft.Extensions.Configuration.CommandLine
  3. 因为我们需要命令行参数,所以我们需要在Main(string[])

    中创建配置
    using Microsoft.Extensions.Configuration;
    
    class Program
    {
        private static int Main(string[] args)
        {
            const string PORT = "12345";
    
            var listeningUrl = $"http://localhost:{PORT}";
            var configuration = new ConfigurationBuilder()
                                .AddCommandLine(args)
                                .Build();
            // Set the `static` `Configuration` property on the `Startup` class.
            Startup.Configuration = configuration;
    
            var builder = new WebHostBuilder()
                .UseStartup<Startup>()
                .UseKestrel()
                .UseSetting("Message", "Hello World")
                .UseUrls(listeningUrl);
    
            var host = builder.Build();
            WriteLine($"Running on {listeningUrl}");
            host.Run();
    
            return SUCCESS_EXIT_CODE;
        }
    }
    

    Startup类是:

    using Microsoft.Extensions.Configuration;
    
    public class Startup
    {
        public static IConfiguration Configuration { get; set; }
    
    
        public void Configure(IApplicationBuilder app)
        {
            foreach (var c in Configuration.AsEnumerable())
                Console.WriteLine($"{c.Key,-15}:{c.Value}");
        }
    }
    

    命令参数是--port 6000 outputDirectory C:\Temp,然后输出:

    port            :6000
    outputDirectory :C:\Temp
    

答案 3 :(得分:4)

ASP.NET Core 2回答:

将默认的Program.cs更改为:

using System;
using System.IO;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                      .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
                config.AddEnvironmentVariables();
                config.AddCommandLine(args);
            })
            .UseStartup<Startup>()
            .Build();
}

我删除了其他位只是为了使配置说明更容易。

请注意配置构建器中的.AddCommandLine(args)行。

与@ BanksySan的答案不同,您不需要创建静态属性,而是让DI将IConfiguration注入启动类。

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

    private IConfiguration Configuration { get; }

您现在可以使用任何配置提供程序,文件,env变量和命令行中的配置条目。

示例:

dotnet run --seed true

    public void Configure(IApplicationBuilder app)
    {
        app.UseExceptionHandler("/Home/Error");

        var seed = Configuration.GetValue<bool>("seed");
        if (seed)
            SeedData.Initialize(app);

        app.UseStaticFiles();
        app.UseMvcWithDefaultRoute();
    }

希望这能进一步帮助别人。