コマンドライン経由で引数が渡されます
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
クラスに取得するにはどうすればよいですか?
静的クラスの使用を避けたい。値を提供するサービスは正しい方法でしょうか?その場合、ミドルウェアにサービスを挿入するにはどうすればよいですか?
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");
Dotnet Core 2
これを実現するために、ドットネットコア1.0のようにほとんどのコードは必要ありません。 AddCommandLine
argumentsは、次の構文を使用して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
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();
}
_
これがさらに誰かを助けることを願っています。
DavidGの答え は正しいですが、まだパズルのピースがいくつか欠けていました。
必要なNugetパッケージは2つあります。
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
_