web-dev-qa-db-ja.com

スタートアップクラスでKestrelのURLを構成する方法

KestrelがリッスンするURLを変更する適切な方法を見つけようとしていますStartupクラスコンストラクターから。

更新:以下の回答に加えて、Startupクラスが私が思っていた方法でKestrelを構成するために使用されていないことを理解するようになりました。私は、Startupが、慣例に従って配置される単一のアプリケーション全体の構成オブジェクトを作成すると思っていましたが、そうではありません。 @Tsengが指摘しているように、アプリケーションとホスティングの構成は別々の関心事です。リンクされた回答と受け入れられた回答は、実用的な例を提供します。

Vagrantで新しいUbuntu14ボックスを起動し、Microsoftからの現在の指示に従ってASP.NET Core 1.1をインストールしました: https://www.Microsoft.com/net/core#linuxubunt

私は走った:

  • dotnet new -t web
  • dotnetの復元
  • dotnet run

これはデフォルトで http:// localhost:50 をリッスンします。 Program.csでは、app.UseUrls( "http:// *:5001)を呼び出すことができます。これは、URLとポートを変更するために機能します。

私が本当に望んでいるのは、Startupクラスに新しいJSON設定ファイルを追加することで慣例によりURLを変更することです。そこで、例に従って、これを使用してhosting.JSONファイルを作成しました(注:「server.urls」と「キーとしてのurls」)。

{
  urls: "http://*:5001"
}

Appsettings.jsonファイルを追加するためのデフォルト行の下のStartup.csで、.AddJsonFile( "hosting.json"、optional:false);を追加しました。 (オプション:ファイルを取得していることを確認するためにfalse)

public Startup(IHostingEnvironment env)
{
  var builder = new ConfigurationBuilder()
  .SetBasePath(env.ContentRootPath)
  .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
  .AddJsonFile("hosting.json", optional: false);
  if (env.IsDevelopment())
  {
    // For more details on using the user secret store see https://go.Microsoft.com/fwlink/?LinkID=532709
    builder.AddUserSecrets();
  }

  builder.AddEnvironmentVariables();
  Configuration = builder.Build();
}

構成のビルド後に設定が存在することを確認しましたが、ホストがProgram.csにビルドされたときに設定が取得または使用されません

public class Program
{
  public static void Main(string[] args)
  {
    var Host = new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

    Host.Run();
  }
}

そして、アプリケーションは引き続きlocalhost:5000でリッスンを開始します。正しいキーで適切に名前が付けられた設定を持つことにより、WebHostBuidlerがそれを取得して使用する必要があることは、私の(おそらく間違っている)理解です。

基本的にスタートアップクラスを取り除き、Program.csで構成を作成し、UseConfigurationの呼び出しに渡すことができる他の例を見てきましたが、やはり私の理解はスタートアップクラスを使用すると、慣例によりこれを行う必要があります。

基本的にスタートアップとプログラムを別々に保ちたい、URLを使用して構成にhosting.JSONファイルを追加し、それを取得して使用するUseUrls、UseConfigurationなどを呼び出す必要はありません。

明らかなことを見逃しているのでしょうか、それとも実際には正しくないことをしようとしているのでしょうか。

私のコメントによると、これが重複していない理由を説明するには:

  • その投稿には、「launcherSettingsはVisual StudioF5用です」と具体的に記載されています。 Linuxボックスでコマンドラインを使用しています。 VSとは何の関係もありません。

  • その投稿で提供されたソリューションは、構成ビルドをmainメソッドに移動しました。私は、デフォルトの「dotnet new -t web」プロジェクトと同じように、Startupクラスで構成をビルドしたいと具体的に述べています。

これが重複しているとは思わないので、ASP.NET Coreソースを確認して、これが可能かどうかを確認しています。

正しいキーに関して:

https://github.com/aspnet/Hosting/blob/b6da89f54cff11474f17486cdc55c2f21f2bbd6b/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs

namespace Microsoft.AspNetCore.Hosting
{
  public static class WebHostDefaults
  {
    public static readonly string ApplicationKey = "applicationName";
    public static readonly string StartupAssemblyKey = "startupAssembly";
    public static readonly string DetailedErrorsKey = "detailedErrors";
    public static readonly string EnvironmentKey = "environment";
    public static readonly string WebRootKey = "webroot";
    public static readonly string CaptureStartupErrorsKey = "captureStartupErrors";
    public static readonly string ServerUrlsKey = "urls";
    public static readonly string ContentRootKey = "contentRoot";
  }
}

https://github.com/aspnet/Hosting/blob/80ae7f056c08b740820ee42a7df9eae34541e49e/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs

public class WebHost : IWebHost
{
  private static readonly string DeprecatedServerUrlsKey = "server.urls";
9
Steve

Hosting.jsonファイルでは、urlの代わりにserver.urlsを使用する必要があります。また、hosting.jsonファイルは、起動時ではなく、program.cs(メインメソッド)に追加する必要があります。

これが私のhosting.jsonファイルです。

{
  "server.urls": "http://localhost:5010;http://localhost:5012"
}

これがMainメソッドです。

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddCommandLine(args)
        .AddEnvironmentVariables(prefix: "ASPNETCORE_")
        .AddJsonFile("hosting.json", optional: true)
        .Build();

    var Host = new WebHostBuilder()
        .UseConfiguration(config)
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    Host.Run();
}

そして、これがスクリーンショットです。

Screenshot of ASP.NET Core app running

6
Anuraj