Переопределение урла сервера из конфига в asp.net core 2.0

05.10.2017 at 21:32

Для того, чтобы переопределить урл в коде, нужно в метод BuildWebHost добавить строку

.UseUrls("http://localhost:60000", "http://localhost:60001")

UseUrls это метод расширения, который выглядит так:

public static IWebHostBuilder UseUrls(this IWebHostBuilder hostBuilder, params string[] urls)
{
    if (urls == null)
    {
        throw new ArgumentNullException(nameof(urls));
    }

    return hostBuilder.UseSetting(WebHostDefaults.ServerUrlsKey, 
        string.Join(ServerUrlsSeparator, urls));
}

т.е. на самом деле он устанавливает настройку с названием WebHostDefaults.ServerUrlsKey, записывая туда урлы, разделенные ServerUrlsSeparator.

Находится этот метод в файле Microsoft.AspNetCore.Hosting.Abstractions/HostingAbstractionsWebHostBuilderExtensions.cs

разделитель объявлен выше

private static readonly string ServerUrlsSeparator = ";";

название настройки объявлено в файле Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs

public static readonly string ServerUrlsKey = "urls"; 

таким образом, для переопределения урлов нужно определить значение настройки «urls», записав туда урлы, разделенные точкой с запятой.

В сгенерированном приложении используется метод CreateDefaultBuilder, который объявлен в Microsoft.AspNetCore/WebHost.cs

Этот метод в том числе добавляет конфигурационные файлы

config.AddJsonFile("appsettings.json", 
                   optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", 
                   optional: true, reloadOnChange: true);

Таким образом, для переопределения настройки можно создать в файле appsettings.json нужную настройку.

У меня этот файл стал выглядеть так

{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  },
  "urls": "http://localhost:40000"
}

запускаем приложение и видим, что ничего не работает. В поисках решения я нашел вот такое обсуждение

https://github.com/aspnet/KestrelHttpServer/issues/1851

в котором я и нашел способ решить проблему. Нужно переопределить конфигурацию следующим образом:

WebHost.CreateDefaultBuilder(args)
    .UseConfiguration(new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .Build()
    )
    .UseStartup<Startup>()
    .Build();

Запускаем — работает.

В обсуждении https://github.com/aspnet/Hosting/issues/1148 я нашел, что ConfigureAppConfiguration используется для конфигурирования сервисов приложения, в то время как для конфигурирования WebHostBuilder нужно использовать UseConfiguration. Надеюсь эту путаницу исправят в следующих версиях.