web-dev-qa-db-ja.com

ASP CoreでStartupクラスにコマンドライン引数を渡します

コマンドライン経由で引数が渡されます

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;
}

これらの引数の1つは、ログ出力ディレクトリです。リクエストを受け取ったときにこのディレクトリに書き込めるように、この値をStartupクラスに取得するにはどうすればよいですか?

静的クラスの使用を避けたい。値を提供するサービスは正しい方法でしょうか?その場合、ミドルウェアにサービスを挿入するにはどうすればよいですか?

14
BanksySan

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");
15
DavidG

Dotnet Core 2

これを実現するために、ドットネットコア1.0のようにほとんどのコードは必要ありません。 AddCommandLineargumentsは、次の構文を使用してWebHostをビルドすると自動的に挿入されます

ステップ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
7
Charith

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; }
_

これで、構成プロバイダー、ファイル、環境変数およびコマンドラインのいずれかの構成エントリーを使用できます。

例:

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();
    }
_

これがさらに誰かを助けることを願っています。

5
Allan

DavidGの答え は正しいですが、まだパズルのピースがいくつか欠けていました。

必要なNugetパッケージは2つあります。

  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
_
4
BanksySan