2016-07-11 2 views
1

Я работаю с веб-приложением ASP.NET Core 1 RTM, и я обновляю настройку Kestrel до последних соглашений. Установка направлена ​​на имеющей следующие источники server.urls, от самого низкого до самого высокого приоритета:Источник конфигурации Json игнорируется в настройке Kestrel

  1. URL-адрес, установленный в Program.Main() коде (по умолчанию, например, для производства)
  2. URL-адреса, установленного в hosting.Development.json (например, переопределить значение по умолчанию при разработке)
  3. URL-набор переменных окружения (например, переопределить значение по умолчанию для постановки или другого производства окр.)

в соответствии с последними ссылками (например here on SO и here on Github), это ж Шляпа я получил в настоящее время:

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. 

Мои expecte d будет вместо Now listening on: http://localhost:51254. Значение URL-адресов правильно выбрано из источника JSON (согласно журналу консоли), но затем конфигурация Kestrel игнорирует это, даже если UseConfiguration приходит послеUseUrls.

Что мне не хватает? Спасибо за ваши предложения.

+0

Что делать, если вы используете 'urls' как имя вместо' server.urls'? (https://github.com/aspnet/Hosting/blob/e7b8c3f90a781a55658b4245571c5bf5dac5e56e/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs#L15) – Pawel

+0

Я просто попробовал (повторно) добавить как 'UseUrls()', а затем установите 'urls' в источниках Json. Настройки из источника Json правильно подобраны! Два вопроса?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, например. по умолчанию, а затем по одному для каждой среды. В основном я пытался воспроизвести в Program.Main() поведение, подобное Startup.Startup(IHostingEnvironment env), где в качестве источника можно использовать как "appsettings.json", так и $"appsettings.{hostingEnv.EnvironmentName}.json". Единственная проблема заключается в том, что в Program.Main() нет Доступен IHostingEnvironment, но this GH issue напомнил мне, что у нас все еще есть Environment.GetEnvironmentVariable("some-variable") в нашем toolbelt.

Вот полное решение, пожалуйста, не стесняйтесь предлагать усовершенствования или (еще лучше) некоторые 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" 
} 
Смежные вопросы