3:WebHost的默認配置



♣ 視頻地址:https://www.bilibili.com/video/av38392956/?p=2

1:承接上文,繼續說一下Program.cs

  1.1:這個方法使用了WebHost方法里的靜態方法CreateDefaultBuilder(),這個CreateWebHostBuilder()會返回一個類型叫IWebHostBuilder

  1.2:而這個WebHostBuilder是一個對象,實現了這個接口的對象,我們暫時叫他WebHostBuilder,這個WebHostBuilder知道如何來設置WebServer的環境,包括里面的參數

  1.3:而這個CreateDefaultBuilder()進行了默認的設置,我們可以在下面寫些代碼來改變默認設置

 

2:首先看下默認配置的主要內容

   2.1:在ASP.NET Core里面使用了Kestrel Web服務器,這個服務器是ASP.NET Core內置的並且跨平台的,凡是ASP.NET Core支持的平台這個服務器都能在上面運行

  2.2:Kestrel Web服務器就可以監聽Http請求,我們可以從命令行運行Kestrel Web Server

  2.3: 如果你安裝ReSharper,就可以對CreateDefaultBuilder()這個方法進行反編譯,當然了很多人是沒裝的,但是也有辦法,如下圖:

    2.3.1:選擇工具,選項,文本編譯器,C#,高級,支持導航到反編譯(實驗)把這個勾上!

   2.4:然后我們就可以對CreateDefaultBuilder()進行反編譯了,在方法上F12,選擇是,就可以看到源碼了,下面的紅框里就可以看到,使用了Kestrel Web Server

   2.5:還有一個默認配置是,我們這個應用默認使用了IIS並且使用了IIS集成,實際是兩個方法,一個是UseIIS(),一個是UseIISIntegration()

    2.5.1:UseIISIntegration(),假如說我們這個應用運行於IIS服務器,那么UseIISIntegration()這個方法就允許IIS通過Windows的憑證驗證來到Kestrel服務器。這對於構建內網的web應用非常有用。

    2.5.2:UseIIS()這個方法會啟動.NET Core的CLR 運行時,並且把我們的web應用放在IIS Worker進程里面,這個進程要么是w3wq.exe,要么就是IIS Express.exe,這種形式就叫Inprocess 模型。與之相反的就是outofprocess,前面說過outofprocess這個模型把請求轉發給或者說代理給Kestrel服務器,這種性能就沒有InProcess好

  2.6:我們繼續看CreateDefaultBuilder()的源碼,往下拉,你會看到紅框里面它先使用了UseIIS()方法,然后使用了UseIISIntegration()方法

   2.7:默認配置還有一個Log設置,直接看源碼,下圖

    2.7.1:還是CreateDefaultBuilder(),它配置了ConfigureLogging(),然后參數里面用Lambda表達式做了配置,比如說AddConsole().輸出到控制台,AddDebug()輸出到VS 輸出窗口

 

   2.8:IConfiguration接口,我們這個默認的WebHostBuilde,它會創建一個對象,這個對象將實現IConfiguration這個接口,而我們可以再整個的ASP.NET Core應用里來訪問這個對象

   2.9:我們可以通過IConfiguration接口從實現了他在這個接口的對象里獲取我們所需要的配置信息,看源碼:↓

    2.9.1:默認的WebHostBuilder是new出來的,然后進去WebHostBuilder里面去,看源碼:↓    

    2.9.2:里面有個IConfiguration屬性,在構造函數里進行了賦值    Configuration = _config

    2.9.3:然后進去IConfiguration里面去,看源碼:↓

    2.9.4:通過索引,就可以取得配置的值,Key Value形式的

 

3:IConfiguration配置信息的來源

  ♠:appsettings.json,如果使用它,在web項目根目錄下放這么一個文件,那么這個文件會立即被識別出來,因為默認配置CreateDefaultBuilder()里面使用了這個文件名,如下圖,當然你使用其他的什么什么.json也可以

  

  ♣:User Secrets

  ♥:電腦的環境變量

  ♦:命令行啟動參數

  ....等等,不列舉那么多了

 

4:由於項目里已經有了appsetting.json,那我們就用這個了,我們現在如何把運行出現的Hello World移植到這個設置里呢,可以這么寫

  4.1:如上圖,在下面加一個變量Welcome,他的值是Hello World!!!!


 

  4.2:回到Startup.cs,我們需要把值讀取出來,這時候我們需要使用IConfiguration,實現了該接口的一個對象,我們暫時管它叫服務configuration

  4.3:這種方式就是在這個方法的參數里請求了這么一個服務,並且這個服務是實現了IConfiguration這個接口的服務,實現了這個接口的對象,那為什么可以這么做呢?

  4.4:因為ASP.NET Core使用依賴注入,而且是在整個應用幾乎所有的地方都可以使用依賴注入,所以可以這么用,它的原理如下

  4.5:原理:當ASP.NET Core調用Configure這個方法的時候,ASP.NET Core會分析這個方法的參數,目前請求這三個參數,他就會進行分析,如果ASP.NET Core能解析這些參數的類型,那么ASP.NET Core就會傳進來實現該接口的對象/或者叫服務

  4.6:現在呢實現了IConfiguration的這個接口的對象已經被注入進來了,所以我們可以使用configuration來獲取從appsetting.json的配置信息

  4.7:如下圖所示,可以讀取到appsetting.json的變量信息

 


 

  4.8:IConfiguration這個接口的配置信息源可以來自不同的地方,下面來試一下不同的地方的優先級

    4.8.1:系統環境變量,我們在系統環境變量添加一個Welcome,值是Hello From Environment Variables

    4.8.2:然后我們可以F5運行項目,看到值變成了Hello From Environment Variables,所以說系統環境變量的優先級>appsetting.json文件的優先級

    4.8.3:那么為什么系統環境變量的優先級要比appsetting.json的優先級要高?看源碼:↓

     4.8.4:可以看到有個config,這個config就是IConfigurationBuilder ,首先添加了Json文件,AddJsonFile,在appsetting.json讀取配置信息

     4.8.5:后面有個hostingEnvironment.EnvironmentName,什么意思呢,就是你現在是開發的環境,那么就是appsettings.Development.json,就是下圖這個文件,如果這個文件存在的話,就會從這個文件讀取配置信息,appsettings.Development.json的優先級>appsetting.json的優先級

     4.8.6:然后繼續看源碼,有個config.AddEnvironmentVariables(),就是繼續加載系統的環境變量,如果系統的環境變量里存在和上面兩個同樣的屬性信息,那么就會采用系統環境變量,也就是后加載的

     4.8.7:再往后看,有個config.AddCommandLine(args),命令行的啟動參數,如果在命令行啟動參數設置變量叫Welcome,那么程序最后輸出的是命令行啟動參數這個Welcome所對應的值

    4.8.8:綜上所述,不同的配置源有相同的屬性,那么后加載的配置源將會覆蓋之前配置源的這個屬性的值

    4.8.9:那么命令行是怎么加的呢,如圖所示,可以看到,最終加載的是:Hello World From Command Line

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM