ASP.NET CORE系列【七】分析NetCore啟動原理

来源:https://www.cnblogs.com/shumin/archive/2019/08/11/11334063.html
-Advertisement-
Play Games

前言 有很久一段時間沒更新了,因為工作和家裡的問題導致沒能堅持, 現在開始會繼續每周更新,主要是記錄自己所學和一起討論解決過的問題,一起成長, 為.net圈子添磚加瓦! 介紹 到目前為止應該很多同學已經把項目升級到core了,對於項目結構都已經很熟悉了,今天我們主要講解Startup.Cs Prog ...


前言

 有很久一段時間沒更新了,因為工作和家裡的問題導致沒能堅持,

現在開始會繼續每周更新,主要是記錄自己所學和一起討論解決過的問題,一起成長,

為.net圈子添磚加瓦!

介紹

到目前為止應該很多同學已經把項目升級到core了,對於項目結構都已經很熟悉了,今天我們主要講解Startup.Cs   Program.Cs兩個文件

分析Core項目的啟動原理

 

Program.Cs

 

 

   很熟悉Main入口,主要是三個方法CreateWebHostBuilder()    Build()  Run()  很簡單的三個方法,但是他卻能夠順利的把整個項目給啟動起來

   它肯定是在內部封裝了很多東西,那它是如何封裝的呢  是如何運行的

    一.首先我們得學會查看源碼

     1.https://github.com/aspnet/AspNetCore

     2.Vs2019

     3.Reshaper

      這裡有三個方法查看netcore源代碼,第一個就是微軟官方開源的項目地址

      今天我們主要講使用Vs2019方法,Reshaper不建議去使用,電腦配置不高的情況下會很卡,而且vs2019的新功能也基本上夠用了

     使用vs2019先設置   工具->選項->文本編輯器->c#->高級->支持導航到反編譯(實驗)

    勾上之後,按f12就能定位到源碼

 

二.啟動順序

 1 Main()入口   

 

 2 WebHostBuilder()準備 

     CreateDefaultBuilder方法 從命名就能看出,它註入了很多服務,大家可以定位進入仔細看看

     創建WebHost預設配置,載入自定義配置UseStartup()主要在Startup.cs裡面自行配置

    主要是配置Service Di和http管道,這些都市在WebHost啟動之前做的事

    我們f12定位打源代碼查看

 1 public static IWebHostBuilder CreateDefaultBuilder(string[] args)
 2         {
 3             WebHostBuilder webHostBuilder = new WebHostBuilder();
 4             if (string.IsNullOrEmpty(webHostBuilder.GetSetting(WebHostDefaults.ContentRootKey)))
 5             {
 6                 webHostBuilder.UseContentRoot(Directory.GetCurrentDirectory());
 7             }
 8             if (args != null)
 9             {
10                 webHostBuilder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());
11             }
12             webHostBuilder.UseKestrel(delegate (WebHostBuilderContext builderContext, KestrelServerOptions options)
13             {
14                 options.Configure(builderContext.Configuration.GetSection("Kestrel"));
15             }).ConfigureAppConfiguration(delegate (WebHostBuilderContext hostingContext, IConfigurationBuilder config)
16             {
17                 IHostingEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
18                 config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile("appsettings." + hostingEnvironment.EnvironmentName + ".json", optional: true, reloadOnChange: true);
19                 if (hostingEnvironment.IsDevelopment())
20                 {
21                     Assembly assembly = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName));
22                     if (assembly != null)
23                     {
24                         config.AddUserSecrets(assembly, optional: true);
25                     }
26                 }
27                 config.AddEnvironmentVariables();
28                 if (args != null)
29                 {
30                     config.AddCommandLine(args);
31                 }
32             }).ConfigureLogging(delegate (WebHostBuilderContext hostingContext, ILoggingBuilder logging)
33             {
34                 logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
35                 logging.AddConsole();
36                 logging.AddDebug();
37                 logging.AddEventSourceLogger();
38             })
39                 .ConfigureServices(delegate (WebHostBuilderContext hostingContext, IServiceCollection services)
40                 {
41                     services.PostConfigure(delegate (HostFilteringOptions options)
42                     {
43                         if (options.AllowedHosts == null || options.AllowedHosts.Count == 0)
44                         {
45                             string[] array = hostingContext.Configuration["AllowedHosts"]?.Split(new char[1]
46                             {
47                                 ';'
48                             }, StringSplitOptions.RemoveEmptyEntries);
49                             options.AllowedHosts = ((array != null && array.Length != 0) ? array : new string[1]
50                             {
51                                 "*"
52                             });
53                         }
54                     });
55                     services.AddSingleton((IOptionsChangeTokenSource<HostFilteringOptions>)new ConfigurationChangeTokenSource<HostFilteringOptions>(hostingContext.Configuration));
56                     services.AddTransient<IStartupFilter, HostFilteringStartupFilter>();
57                 })
58                 .UseIIS()
59                 .UseIISIntegration()
60                 .UseDefaultServiceProvider(delegate (WebHostBuilderContext context, ServiceProviderOptions options)
61                 {
62                     options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
63                 });
64             return webHostBuilder;
65         }
View Code

 3 Build()構建   

   構建AspNetCre.Hosting 托管web應用程式

 4 Run()啟動

   運行web應用程式並阻止調用線程,直到主機關閉

   

 

CreateDefaultBuilder方法

 說一下預設配置 配置了哪些東西,結合代碼看一下

 第一行   WebHostBuilder webHostBuilder = new WebHostBuilder(); 創建了webHostBuilder實例,我們F12進去看看

 類裡面的預設構造函數,看到這裡,構造函數實例對象(依賴註入)

  

 

 


 

 

 我們這裡可以看到 提供了ApplicationBuilder工廠  然後把我們各種配置在這裡進行直接註入了

 在Starpup.cs裡面 app.UseMvc() 這種  都是IApplicationBuilder

 現在恍然大悟了

具體工廠里有什麼呢,介面怎麼定義呢,大家有興趣可以自行去瞭解

 

第二行  webHostBuilder.UseContentRoot(Directory.GetCurrentDirectory());

 Use是一個中間件,ContentRoot是我們內容的根目錄,指定了了我們web主機要使用的內容站點根目錄

這個設置決定了安排asp.net core開始搜索內容文件,比如view

也就是說 項目啟動,肯定有一個中間件去調用wwwroot這個文件夾

 

後面還有UseConfiguration中間件  使用一些命令 比如dootnet run 在這裡執行     

 UseKestrel  這是開啟Kestrel中間件  給web主機使用的伺服器,後面代碼又開啟了UseIIs的中間件

可能會疑惑為什麼會開啟不同的呢,

這裡主要是,netcore有兩種運營模式 一個進程內 一個是進程外,這個後續的文章會降到

看大這裡,大家應該都知道.net core啟動是個怎麼回事了,剩下的 可以自行看源碼瞭解哦

 

ps:碼字水平有待提高!

 

 

 

 

 

 

     

 


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

-Advertisement-
Play Games
更多相關文章
  • FutureTask FutureTask是Future的實現,用來非同步任務的獲取結果,可以啟動和取消非同步任務,查詢非同步任務是否計算結束以及獲取最終的非同步任務的結果。通過get()方法來獲取非同步任務的結果,但是會阻塞當前線程直至非同步任務執行結束。一旦任務執行結束,任務不能重新啟動或取消,除非調用ru ...
  • **想看看你最近一年都在幹嘛?看看你平時上網是在摸魚還是認真工作?想寫年度彙報總結,但是苦於沒有數據?現在,它來了。** 這是一個能讓你瞭解自己的瀏覽歷史的Chrome瀏覽歷史記錄分析程式,當然了,他僅適用於Chrome瀏覽器或者以Chrome為內核的瀏覽器。 在該頁面中你將可以查看有關... ...
  • 1. 通過對象實例化 先實例化對象,通過對象.getClass方法實例化 2. 由於1中必須要先有對象,所以在沒有對象的情況下,可以通過類名稱.class方式 3. 通過Class類中的靜態方法 ...
  • 一、小數據池 1. 小數據池定義 小數據池(常量池),一種數據緩存機制,也被稱為駐留機制。小數據池只針對: 整數、字元串、布爾值 。其他數據類型不存在駐留機制。 2. 各類型數據池限定 (1) 整型 在python中 5 ~ 256 之間的整數會被駐留在記憶體中。每次使用都是同一個對象。 (2) 字元 ...
  • 快看小說網 我們在做Web應用的時候,請求處理過程中發生錯誤是非常常見的情況。Spring Boot提供了一個預設的映射:/error,當處理中拋出異常之後,會轉到該請求中處理,並且該請求有一個全局的錯誤頁面用來展示異常內容。我怎麼這麼有錢 選擇一個之前實現過的Web應用(Chapter3-1-2) ...
  • 本系列主要講述IOC依賴註入之Autofac在ASP.NET MVC項目中以及在WebForm項目中的具體應用。 ...
  • 從零單排系列簡介 突然發現自己的基礎不是很牢固,就買了一個《C 7.0的本質論》。本系列博客就是以此書為本,記錄自己的學習心得,如果你的基礎也不牢固,不如跟上博主一起學習成長呀! 本篇博客會從如下幾個方面來講解知識 為什麼要定義數據的類型 數據類型都有哪些 值類型和引用類型有什麼區別呢? 為什麼要定 ...
  • 本篇內容: 冒泡排序 冒泡排序 演算法思想: 冒泡排序的原理是:從左到右,相鄰元素進行比較。 每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。 代碼實現: 運行結果: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...