当前位置:首页 > Web开发 > 正文

最终翻看源代码

2024-03-31 Web开发

措施在颁布部署时候,设置环境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:6000

UseUrls(":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解析

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