最终翻看源代码
措施在颁布部署时候,设置环境ASPNETCORE_URLS不生效,也没在代码里使用UseUrls("xxxx"),启动一直是:5000.最后测试发明只有在appsettings.json中配置urls才生效,网上找了半天资料也没看到有什么问题。
最终翻看源代码,发明是在StartUp中的Configure替换了全局IConfiguration导致。
平时开发梗概知道措施启动时候端口启用挨次是
UseUrls("xxx")> 环境变量 > 默认,具体是怎么确定使用哪个配置的,没找到资料,所有才有了本文。
环境变量ASPNETCORE_URLS
#windows set ASPNETCORE_URLS=http://localhost:6000 #linux export ASPNETCORE_URLS=http://localhost:6000UseUrls(":6000")
appsettings.json新增urls或者server.urls配置
{ "urls":":6000;:6001", "server.urls":":6000;:6001" }使用系统默认
说明措施启动过程中,一个配置key会反复使用,先放这里
//WebHostDefaults.ServerUrlsKey如下 public static readonly string ServerUrlsKey = "urls"; Web项目启动地点配置说明今天是介绍启动方法,所以web启动流程不是重点。直接进入正题。
Web启动最终是挪用WebHost.StartAsync,源代码在这WebHost。此中有个要领EnsureServer来获取启动地点
private static readonly string DeprecatedServerUrlsKey = "server.urls"; //省略 var urls = _config[WebHostDefaults.ServerUrlsKey] ?? _config[DeprecatedServerUrlsKey];是从全局IConfigration实例中获取启动地点。所以我的遇到问题这里就解决了。但环境变量和UseUrls是如何解析并记载进来的呢?下面就开今天讲解。
环境变量配置详解一般Web措施启动代码如下:
Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }).Build().Run();此中ConfigureWebHostDefaults的会用挪用扩展要领ConfigureWebHost
public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, Action<IWebHostBuilder> configure) { return builder.ConfigureWebHost(webHostBuilder => { WebHost.ConfigureWebDefaults(webHostBuilder); configure(webHostBuilder); }); }以上代码都是界说在Microsoft.Extensions.Hosting中。
继续看ConfigureWebHost代码,这个要领就界说在Microsoft.AspNetCore.Hosting措施集中了。
public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IWebHostBuilder> configure) { //这里会加载环境变量 var webhostBuilder = new GenericWebHostBuilder(builder); //这里会挪用UseUrls等扩展要领 configure(webhostBuilder); builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>()); return builder; }在GenericWebHostBuilder 结构函数里有如下代码,用来初始化配置,最终添加到全局
IConfiguration实例中,也就是Host中IConfiguration实例。
builder.ConfigureServices((context, services) => services.AddHostedService());这个是web启动重点,,有兴趣的可以看下
//插手环境变量配置 _config = new ConfigurationBuilder() .AddEnvironmentVariables(prefix: "ASPNETCORE_") .Build(); //把配置加载到Host _builder.ConfigureHostConfiguration(config => { config.AddConfiguration(_config); // We do this super early but still late enough that we can process the configuration // wired up by calls to UseSetting ExecuteHostingStartups(); })AddEnvironmentVariables环境变量解析最终会使用EnvironmentVariablesConfigurationProvider,有兴趣的可以看下AddEnvironmentVariables源代码,EnvironmentVariablesConfigurationProvider解析环境的要领如下。
public override void Load() { Load(Environment.GetEnvironmentVariables()); } internal void Load(IDictionary envVariables) { var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); //这里是筛选ASPNETCORE_开头的环境变量 var filteredEnvVariables = envVariables .Cast<DictionaryEntry>() .SelectMany(AzureEnvToAppEnv) .Where(entry => ((string)entry.Key).StartsWith(_prefix, StringComparison.OrdinalIgnoreCase)); foreach (var envVariable in filteredEnvVariables) { //这里会把前缀去失加到配置里 var key = ((string)envVariable.Key).Substring(_prefix.Length); data[key] = (string)envVariable.Value; } Data = data; }IConfiguration中的key是不区分巨细写的,所有最终的效是在全局IConfiguration中新增一条key为urls的记录。
而如果使用默认Host.CreateDefaultBuilder(),appsettings.json中的配置会先加载。
如果在appsettings.json中配置urls的话,环境变量也界说了,就会被环境变量的笼罩失。
UseUrls解析最终会挪用GenericWebHostBuilder中的UseSetting
//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)); } //GenericWebHostBuilder中的UseSetting public IWebHostBuilder UseSetting(string key, string value) { _config[key] = value; return this; }温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31998.html