Переопределение урла сервера из конфига в asp.net core 2.0
Для того, чтобы переопределить урл в коде, нужно в метод 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. Надеюсь эту путаницу исправят в следующих версиях.