主頁 > .NET開發 > 如何開始閱讀ASP.NET Core源代碼

如何開始閱讀ASP.NET Core源代碼

2020-09-17 06:16:54 .NET開發

背景

當我們對ASP.Net Core內部的某些方法、類的實作感興趣時,有很多方法可以去了解,看書,看各種文章,但是最直接也是最深入的辦法就是去閱讀源代碼,
ASP.NET Core的源代碼托管在Github,專案地址是:https://github.com/dotnet/aspnetcore,
如果只是簡單的想看某個方法是如何實作的,我們可以直接在github網站上瀏覽,
但是通過網頁閱讀源代碼會遇到一些問題,首先是找到指定的類或方法并不容易,其次代碼的展示效果并不友好,
因此最佳的方式就是下載源代碼到我們本機,

下載源代碼

在GitHub上托管的專案的源代碼提供了幾種下載方式:

使用git、SVN、GitHub的客戶端,或者直接下載GitHub打包好的源代碼壓縮包,
如果是簡單的專案,你可以直接下載GitHub打包好的源代碼壓縮包,

但是對于ASP.NET Core這種大型專案,下載的源代碼壓縮包由于缺少子模塊的代碼,無法通過編譯,
不能通過編譯的代碼,下面這些功能無法使用:IDE提供的類和方法間的快速導航(F12),針對某個屬性、方法等查找它被哪些代碼所參考,
對于大型專案來說,缺少這些功能幾乎沒辦法深入閱讀該專案的源代碼,
尤其是ASP.NET Core這種大量使用了擴展方法的專案,擴展方法可能定義在一個不起眼的角落,通過手工查找繁瑣且困難,
所以強烈推薦使用git來克隆ASP.NET Core專案的倉庫:

git clone --recursive https://github.com/dotnet/aspnetcore


編譯的準備作業

現在,我們已經有源代碼了,但是由于ASP.NET Core專案使用了很多其他技術,所以編譯源代碼之前需要準備編譯環境,
不同的作業系統需求不一樣,以Windows環境下使用Visual Stuido舉例,當前官方檔案(3.1.1版本)上面列出的需求是:

  • Windows 10 version 1803 或更新版本
  • Visual Studio 2019
    版本雖然沒有要求,但是實際依賴的部分組件會在更新版本的更新中包含,
    例如,如果你編譯3.1.0版本的代碼,需要更新到16.4.4以上版本(包含新版本的MSBuild),
    如果使用VS Code,請看后面的介紹,
  • Git https://git-scm.org
  • NodeJS 10.14.2或更新版本 https://nodejs.org
  • Java Development Kit 11 或更新版本
  • Chrome 基于Selenium的測驗要用到

如果你使用的是其它環境(Linux或macOS, VS Code等),請查看詳細的安裝檔案(源代碼中的docs/BuildFromSource.md檔案),按照其中Install pre-requisites部分的指引準備編譯環境,
更細節的內容,比如編譯時怎么查找JDK的(如果你本機已經安裝過了,但是腳本提示找不到),你可以直接查看編譯腳本,.\build.ps1(或.\build.sh)檔案,

還原

當編譯環境準備好以后,記得開啟新的命令列視窗,因為新增的環境變數只在安裝后啟動的命令列中生效,
前面克隆到本機的是最新的代碼(更新頻繁),但是對于大多數人來說,我們只關注自己目前正在使用的版本,
ASP.NET Core所有版本的發布都打了標簽(tag),
因此,我們可以先使用git命令列出所有的版本,

git tag

然后根據標簽名稱,切換到我們的目標版本,比如3.1.0版本,

git checkout v3.1.0

在你使用Visual Studio或VS Code瀏覽代碼之前需要運行.\restore.cmd(Windows環境,Linux和macOS請使用對應的.sh檔案,下同)來還原編譯所依賴的運行環境和各種組件,
每次源代碼有大的更新時,你都需要重新運行.\restore.cmd,
運行.\restore.cmd后,腳本會立即開始檢查編譯所依賴的運行環境并下載各種組件(第一次運行時),
由于服務器都在國外,因此有些組件下載速度很慢,(如果某個組件下載速度很慢,kexue上網會有極大的改善)

首先會下載dotnet運行環境,這個是最大也是最慢的,做好心理準備,
它被存放在根目錄的.dotnet目錄下,差不多有1GB,

接下來開始下載各個專案所依賴的組件,這部分是通過nuget工具來下載的,
因為網路的原因,下載常常會出錯,在我的中國電信寬帶下反復重試依然如此,
因為nuget會在本地快取曾經下載過的組件,所以一旦發生上面的情況,你可以通過下面這種方式解決:
在VS中新建一個ASP.NET Core的專案,然后在管理NuGet包界面來下載這個包(這時候就能下載了,問號臉),
之后因為本地有快取了,再次通過命令列下載的時候就無需網路了,

在我本機編譯的程序中,遇到了找不到某個包的情況:Microsoft.Internal.AspNetCore.H2Spec.All 2.1.1,
手工在nuget.org上搜索居然沒有,后來在myget上找到了,還是先在Visual Studio的Package Manager Console中使用下面的這個命令先安裝在上面新建的專案中:

PM> Install-Package Microsoft.Internal.AspNetCore.H2Spec.All -Version 2.1.1 -Source https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json

再次運行命令就能找到包了,
運行圖:
 


打開解決方案

由于ASP.NET Core專案實在太大了——包含單元測驗在內有626個csproj檔案,8207個cs檔案——所以并沒有一個包含所有子專案的解決方案(.sln檔案),
在.\src目錄下面有很多子目錄,每一個子目錄都是一個子專案,每個子專案中都包含了一個解決方案(.sln檔案),
和我們平常打開自己的專案不一樣,ASP.NET Core的解決方案檔案(.sln)由于需要設定環境變數因此需要使用腳本命令來打開,
運行子目錄中的startvs.cmd即可啟動Visual Studio打開相應的子專案,

根據電腦配置,第一次啟動可能需要耗費相當長的時間,下次就快了,
下圖是MVC專案的解決方案,巨大無比吧,

現在,讓我們開始好好享受閱讀的樂趣吧,(手動狗頭)

如果你需要編譯源代碼的話,修改源代碼以后運行.\build.cmd檔案,然后你可以去泡茶了,回來應該就差不多了,(再次狗頭)

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/63166.html

標籤:.NET Core

上一篇:一個新實驗:使用gRPC-Web從瀏覽器呼叫.NET gRPC服務

下一篇:Asp.Net Core IdentityServer4 管理面板集成

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more