[英]Pass command-line arguments to Startup class in ASP.NET Core
我通過命令行傳入了參數
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
類,以便在收到請求時可以寫出到此目錄?
我想避免使用靜態類。 提供價值的服務是正確的方式嗎? 如果是這樣,我如何將服務注入到我的中間件中?
您應該能夠使用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");
點網核心 2
您不需要 dotnet core 1.0 中的大部分代碼來實現這一點。 當您使用以下語法 BuildWebHost 時會自動注入AddCommandLine
參數
第 1 步。
public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
步驟 2. 使用以下代碼使用 DI 將配置注入 Startup.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
ASP.NET 核心 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; }
您現在可以使用來自任何配置提供程序、文件、環境變量和命令行的配置條目。
示例:
dotnet 運行 --seed 真
public void Configure(IApplicationBuilder app)
{
app.UseExceptionHandler("/Home/Error");
var seed = Configuration.GetValue<bool>("seed");
if (seed)
SeedData.Initialize(app);
app.UseStaticFiles();
app.UseMvcWithDefaultRoute();
}
希望這可以進一步幫助某人。
DavidG 的回答是正確的,但我仍然缺少一些拼圖。
您需要兩個 Nuget 包:
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Configuration.CommandLine
因為我們需要命令行參數,所以我們需要在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
如果您只需要傳遞給進程的原始命令行參數,或者您不想將它們添加到配置中,您仍然可以使用以下命令:
Environment.GetCommandLineArgs();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.