2016-07-11 10 views
1

私はASP.NET Core 1 RTM Webアプリケーションを使用しています。Kestrelセットアップを最新の規約に更新しています。セットアップは、最低から最高の優先度に、server.urlsに次のソースを持つことを目指し:Program.Main()コード(デフォルト、生産用など)に設定されたKestrelセットアップでJson設定ソースが無視される

  1. のURL(開発中のデフォルトを上書きするなど)hosting.Development.jsonに設定
  2. のURL
  3. を環境変数に設定
  4. のURL(例えばステージングや他の生産ENVのデフォルトを上書きする。)最新の参照(例えばhere on SOhere on Github)を1として

、これはワットであります

ProjDir\Program.cs

public class Program 
{ 
    // Entry point for the application 
    public static void Main(string[] args) 
    { 
     const string hostingDevFilepath = "hosting.Development.json"; 
     const string environmentVariablesPrefix = "ASPNETCORE_"; 

     string currentPath = Directory.GetCurrentDirectory(); 

     var hostingConfig = new ConfigurationBuilder() 
      .SetBasePath(currentPath) 
      .AddJsonFile(hostingDevFilepath, optional: true) 
      .AddEnvironmentVariables(environmentVariablesPrefix) 
      .Build(); 

     System.Console.WriteLine("From hostingConfig: " + 
      hostingConfig.GetSection("server.urls").Value); 

     var host = new WebHostBuilder() 
      .UseUrls("https://0.0.0.0") 
      .UseConfiguration(hostingConfig) 
      .UseKestrel() 
      .UseContentRoot(currentPath) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 
    } 
} 

ProjDir\hosting.Development.json:帽子、私が今持って、コマンドラインから

{ 
    "server.urls": "http://localhost:51254" 
} 

ASPNETCORE_ENVIRONMENT=Developmentを設定した、これが出力されます。

> dotnet run 

Project Root (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation. 
From hostingConfig: http://localhost:51254 
info: AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerMiddleware[0] 
     An existing key was automatically added to the signing credentials list: <<yadda yadda yadda>> 
Hosting environment: Development 
Content root path: <<my project root dir>> 
Now listening on: https://0.0.0.0:443 
Application started. Press Ctrl+C to shut down. 

マイ期待するd出力はNow listening on: http://localhost:51254になります。 URL値はJSONソース(コンソールログごとに)から正しく選択されますが、UseConfigurationUseUrlsになってもKestrelの設定で無視されます。

私には何が欠けていますか?あなたの提案をありがとう。

+0

'server.urls'ではなく' urls'を名前として使用するとどうなりますか? (https://github.com/aspnet/Hosting/blob/e7b8c3f90a781a55658b4245571c5bf5dac5e56e/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs#L15) – Pawel

+0

私は 'UseUrls()'とJsonのソースに 'urls'を設定してください。 Jsonソースからの設定が正しく選択されています! 2つの質問?Q1:これはどこかでまだ文書化されていますか(コードを見れば別に:) Q2: 'UseUrls'がなくても' server.urls'でも動作しますか? Tnx – superjos

+0

私はそれが構成されている場合、自動的にピックアップされていると思います。 'UseUrls'では、プログラムでURLを設定できます。 – Pawel

答えて

2

urls代わりのserver.urlsを使用してみてください。設定の名前はRC2の後に変更されました。

+0

参照された変更は1.0.0でタグ付けされたコミットに属しているので、おそらくRC2の後であってRTMに着陸した – superjos

+0

あなたは正しい。私は答えを更新しました。 – Pawel

1

さらにいくつかのテストを行いました。 UseUrls()が存在するとすぐに、どのような順序であっても、すべてのJson設定ソースは無視されます。

私は、hosting.jsonファイルを複数サポートする解決策を考え出しました。デフォルトの1つ、そして環境ごとに1つです。基本的にはProgram.Main()に複製しようとしましたが、Startup.Startup(IHostingEnvironment env)と似ていますが、"appsettings.json"$"appsettings.{hostingEnv.EnvironmentName}.json"の両方をソースとして使用できます。唯一の問題はProgram.Main()にあります。IHostingEnvironmentがありますが、this GH issueは私たちのツールベルトにまだEnvironment.GetEnvironmentVariable("some-variable")があることを思い出しました。

ここでは完全な解決策だ、(より良い)の改善を提案すること自由に感じたりしてくださいいくつかのsemplification:

public class Program 
{ 
    // Entry point for the application 
    public static void Main(string[] args) 
    { 
     const string environmentVariablesPrefix = "ASPNETCORE_"; 

     string hostingEnvironmentKey = $"{environmentVariablesPrefix}ENVIRONMENT"; 
     string hostingEnvironmentValue; 

     try 
     { 
      hostingEnvironmentValue = Environment 
       .GetEnvironmentVariable(hostingEnvironmentKey); 
     } 
     catch 
     { 
      hostingEnvironmentValue = "Development"; 
     } 

     const string hostingFilepath = "hosting.json"; 
     string envHostingFilepath = $"hosting.{hostingEnvironmentValue}.json"; 

     string currentPath = Directory.GetCurrentDirectory(); 

     var hostingConfig = new ConfigurationBuilder() 
      .SetBasePath(currentPath) 
      .AddJsonFile(hostingFilepath, optional: true) 
      .AddJsonFile(envHostingFilepath, optional: true) 
      .AddEnvironmentVariables(environmentVariablesPrefix) 
      .Build(); 

     var host = new WebHostBuilder() 
      .UseConfiguration(hostingConfig) 
      .UseKestrel() 
      .UseContentRoot(currentPath) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 
    } 
} 
// in hosting.json 
{ 
    "server.urls": "https://0.0.0.0" 
} 

// in hosting.Development.json 
{ 
    "server.urls": "http://localhost:51254" 
} 
関連する問題