簡體   English   中英

將命令行參數傳遞給 ASP.NET Core 中的 Startup 類

[英]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 包:

  1. Microsoft.Extensions.Configuration.Binder
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM