NetCore 啟動地址配置詳解

来源:https://www.cnblogs.com/cgyqu/archive/2020/01/08/12169014.html
-Advertisement-
Play Games

背景 程式在發佈部署時候,設置環境 不生效,也沒在代碼里使用 ,啟動一直是 .最後測試發現只有在 中配置 才生效,網上找了半天資料也沒看到有什麼問題。 最終翻看源代碼,發現是在 中的 替換了全局 導致。 平時開發大體知道程式啟動時候埠啟用順序是 環境變數 預設,具體是怎麼確定使用哪個配置的,沒找到 ...


背景

程式在發佈部署時候,設置環境ASPNETCORE_URLS不生效,也沒在代碼里使用UseUrls("xxxx"),啟動一直是http://localhost:5000.最後測試發現只有在appsettings.json中配置urls才生效,網上找了半天資料也沒看到有什麼問題。

最終翻看源代碼,發現是在StartUp中的Configure替換了全局IConfiguration導致。

平時開發大體知道程式啟動時候埠啟用順序是
UseUrls("xxx")> 環境變數 > 預設,具體是怎麼確定使用哪個配置的,沒找到資料,所有才有了本文。

啟動地址配置的幾種方式介紹
  1. 環境變數ASPNETCORE_URLS
#windows 
set ASPNETCORE_URLS=http://localhost:6000
#linux 
export ASPNETCORE_URLS=http://localhost:6000
  1. UseUrls("http://localhost:6000")
  2. appsettings.json新增urls或者server.urls配置
{
    "urls":"http://localhost:6000;http://localhost:6001",
    "server.urls":"http://localhost:6000;http://localhost:6001"
}
  1. 使用系統預設
說明

程式啟動過程中,一個配置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實例中,也就是HostIConfiguration實例。

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;
}

由於這個方法是在 new GenericWebHostBuilder(builder);
之後調用,就是 configure(webhostBuilder);,上面代碼也有說明。所以IConfigurationurls如果有值,又會被覆蓋掉。所以優先順序最高的是UseUrls()

預設地址

假如以上3種配置都沒有,就是地址為空,會使用預設策略。這裡是源代碼,下麵是預設策略使用的地址

 /// <summary>
 /// The endpoint Kestrel will bind to if nothing else is specified.
 /// </summary>
 public static readonly string DefaultServerAddress = "http://localhost:5000";

 /// <summary>
 /// The endpoint Kestrel will bind to if nothing else is specified and a default certificate is available.
 /// </summary>
 public static readonly string DefaultServerHttpsAddress = "https://localhost:5001";
結論
  1. 啟動埠設置優先順序如下:
    UseUrls("xxxx") > 環境變數 > appsetting.json配置urls>預設地址
  2. 不要隨意替換全局的IConfiguration,如果不手動加入環境變數解析的話,會丟失一部分配置數據。

作者:cgyqu
出處:https://www.cnblogs.com/cgyqu/p/12169014.html
本站使用「署名 4.0 國際」創作共用協議,轉載請在文章明顯位置註明作者及出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基本摘要 用python django開發時,個人選中Xadmin後臺管理系統框架,因為它*內置功能豐富, 不僅提供了基本的CRUD功能,還內置了豐富的插件功能。包括數據導出、書簽、圖表、數據添加嚮導及圖片相冊等多種擴展功能。但是上傳圖片時想實現圖片文件重命名並生成圖片預覽圖時,從網上找了一些大牛寫 ...
  • 方法一:psutil模塊 psutil 方法二:、proc proc 方法三:subprocess pipe,poen top+Popen ...
  • 譯者:Jiong 鏈接: https://robots.thoughtbot.com/how-to-manage-your-python-projects-with-pipenv 在thoughtbot,我們用Ruby和Rails工作,但通常我們總是嘗試使用最合適的語言或者框架來解決問題。 我最近一 ...
  • 攔截器介紹 mybatis提供了 @Intercepts 註解允許開發者對mybatis的執行器Executor進行攔截。 Executor介面方法主要有update、query、commit、rollback等等。 主要思路為: 1. 進入攔截器方法中 2. 獲取攔截器方法參數 3. 獲取解析參數 ...
  • 1. Java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法?stop()和suspend()方法為何不推薦使用? 三種實現方法 1.繼承 Thread 類 擴展性差 無返回值 2, 實現 Runnable 介面 可擴展 無返回值 3. 實現 Callable 介面 有返回值 用synchr ...
  • 這篇文章主要是介紹生成器和IO多路復用機制, 算是學習asyncio需要的預備知識. 這個系列還有另外兩篇文章: 從零開始學asyncio(中) 從零開始學asyncio(下) 一. 簡單爬蟲實例 首先創建一個crawler.py文件, 寫入以下代碼: import socket req = 'GE ...
  • 目的:修改VS Code的註釋文本顏色 S1:假設VS Code的安裝路徑是 %MVSC% S2:文件資源管理器進入目錄 %MVSC%\resources\app\extensions\ S3:該目錄底下由若幹以“theme-”開頭的目錄,例如: theme-abyss theme-defaults ...
  • 控制台錯誤提示: 2020-01-08 18:34:40,292 [http-nio-8080-exec-3] [org.apache.struts2.dispatcher.Dispatcher]-[WARN] Could not find action or result: /views/dire ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...