Переопределение урла сервера из конфига в 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. Надеюсь эту путаницу исправят в следующих версиях.
