Asp.net 将命令行参数传递给ASP核心中的启动类

Asp.net 将命令行参数传递给ASP核心中的启动类,asp.net,.net,asp.net-core,owin,katana,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()

我有通过命令行传入的参数

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;
}
private static int Main(字符串[]args)
{
常量字符串端口=“12345”;
var listeningUrl=$”http://localhost:{PORT}”;
var builder=新的WebHostBuilder()
.UseStartup()
.UseKestrel()
.useURL(ListingURL);
var host=builder.Build();
写线($“在{PORT}上运行”);
host.Run();
返回0;
}
其中一个参数是日志输出目录。如何将该值输入我的
Startup
类,以便在收到请求时写入该目录


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

您应该能够使用
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);
并读入代码:

var someValue = Configuration.GetValue<int>("MySetting:SomeValue");
var-someValue=Configuration.GetValue(“MySetting:someValue”);
是正确的,但我仍然缺少一些拼图

您需要两个Nuget软件包:

  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.CommandLine
  • 因为我们需要命令行参数,所以需要在
    Main(string[])
    中创建配置

    使用Microsoft.Extensions.Configuration;
    班级计划
    {
    私有静态int Main(字符串[]args)
    {
    常量字符串端口=“12345”;
    var listeningUrl=$”http://localhost:{PORT}”;
    var configuration=new ConfigurationBuilder()
    .AddCommandLine(args)
    .Build();
    //在'Startup'类上设置'static''Configuration'属性。
    Startup.Configuration=配置;
    var builder=新的WebHostBuilder()
    .UseStartup()
    .UseKestrel()
    .UseSetting(“消息”、“你好世界”)
    .useURL(ListingURL);
    var host=builder.Build();
    WriteLine($“在{listingURL}上运行”);
    host.Run();
    返回成功\退出\代码;
    }
    }
    
    启动
    类为:

    使用Microsoft.Extensions.Configuration;
    公营创业
    {
    公共静态IConfiguration配置{get;set;}
    公共void配置(IApplicationBuilder应用程序)
    {
    foreach(Configuration.AsEnumerable()中的变量c)
    WriteLine($“{c.Key,-15}:{c.Value}”);
    }
    }
    
    是命令参数are
    --port 6000 outputDirectory C:\Temp
    ,则输出:

    端口:6000
    输出目录:C:\Temp
    
    ASP.NET核心2答案:

    将默认Program.cs更改为:

    使用系统;
    使用System.IO;
    使用Microsoft.AspNetCore;
    使用Microsoft.AspNetCore.Hosting;
    使用Microsoft.Extensions.Configuration;
    公共课程
    {
    公共静态void Main(字符串[]args)
    {
    BuildWebHost(args.Run();
    }
    公共静态IWebHost BuildWebHost(字符串[]args)=>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext,config)=>
    {
    config.SetBasePath(Directory.GetCurrentDirectory());
    config.AddJsonFile(“appsettings.json”,可选:true,reloadOnChange:true)
    .AddJsonFile($“appsettings.{hostingContext.HostingEnvironment.Environment Name}.json”),可选:true,重载更改:true);
    config.AddEnvironmentVariables();
    config.AddCommandLine(args);
    })
    .UseStartup()
    .Build();
    }
    
    我删除了其他位,只是为了使配置解释更简单

    注意配置生成器中的
    .AddCommandLine(args)
    行。

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

    公共类启动
    {
    公共启动(IConfiguration配置)
    {
    配置=配置;
    }
    专用IConfiguration配置{get;}
    
    现在,您可以使用任何配置提供程序、文件、环境变量和命令行中的配置项

    例如:

    dotnet运行--种子为真

    public void配置(IApplicationBuilder应用程序)
    {
    app.UseExceptionHandler(“/Home/Error”);
    var seed=Configuration.GetValue(“seed”);
    如果(种子)
    SeedData.Initialize(app);
    app.UseStaticFiles();
    app.UseMvcWithDefaultRoute();
    }
    

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

    Dotnet Core 2

    您不需要像dotnetcore1.0那样的大部分代码来实现这一点。
    AddCommandLine
    当您使用以下语法构建WebHost时,会自动插入参数

    第一步

    public static IWebHost BuildWebHost(string[] args)
    {
        return WebHost.CreateDefaultBuilder(args)
                      .UseStartup<Startup>()
                      .Build();
    }
    
    步骤3.使用配置对象访问参数

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

    太好了!你知道它所在的Nuget软件包是什么吗?是的,听起来很合理,但它不在里面。我知道了,在顶部有一个使用Microsoft.Extensions.Configuration.CommandLine;的
    ,但仍然没有
    AddCommandLine
    方法。软件包管理器声称它是
    1.1.2
    成功安装的Microsoft.Extensions.Configuration.CommandLine 1.1.2“
    我实际上两个都有。同样在Microsoft文档中:在Windows服务中托管ASP.NET Core时,我也可以在Worker.cs类上执行相同的操作-添加一个构造函数,该构造函数也可以使用IConfiguration对象。
    public class Startup
    {
        private readonly IConfiguration Configuration;
    
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        ...
    
    }
    
    var seed = Configuration.GetValue<bool>("seed");
    Console.WriteLine($"seed: {seed}");
    
    dotnet run seed=True