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