前言
因為工作原因博客斷斷續續更新,其實在很早以前就有想法做一套關於ASP.NET CORE整體學習度路線,整體來說國內的環境的.NET生態環境還是相對比較嚴峻的,但是干一行愛一行,還是希望更多人加入.NET的大環境當中。所以萌生了做一篇關於.NET CORE 學習的學習筆記,借着今天小酌幾杯的機會,把這個想法踐行一下。
為什么學習 ASP.NET Core程序
數百萬開發人員在使用ASP.NET創建Web應用。而ASP.NET Core 是對ASP.NET 的重新設計,在結構上做了更改,產生了更精簡、更模塊化的框架。
ASP.NET Core 具有如下有點:
- 生成 Web UI 和 Web API 的統一場景。
- 針對可測試性進行構建。
- Razor Pages 可以使基於頁面的編碼方式更簡單高效。
- Blazor 允許在瀏覽器中使用 C# 和 JavaScript。 共享全部使用 .NET 編寫的服務器端和客戶端應用邏輯。
- 能夠在 Windows、macOS 和 Linux 上進行開發和運行。
- 開放源代碼和以社區為中心。
- 集成新式客戶端框架和開發工作流。
- 支持使用 gRPC 托管遠程過程調用 (RPC)。
- 基於環境的雲就緒配置系統。
- 內置依賴項注入。
- 輕型的高性能模塊化 HTTP 請求管道。
- 能夠托管於以下各項:
1.Kestrel
2.IIS
3.HTTP.sys
4.Nginx
5.APache
6.Docker - 並行版本控制
- 簡化新式 Web 開發的工具。
ASP.NET Core 和 ASP.NET 比較
| ASP.NET Core | ASP.NET |
|---|---|
| 針對 Windows、macOS 或 Linux 進行生成 | 針對 Windows 進行生成 |
| Razor Pages 是在 ASP.NET Core 2.x 及更高版本中創建 Web UI 時建議使用的方法。 另請參閱 MVC、Web API 和 SignalR。 | 使用 Web Forms、SignalR、MVC、Web API、WebHook 或網頁 |
| 每個計算機多個版本 | 每個計算機一個版 |
| 使用 C# 或 F# 通過 Visual Studio、Visual Studio for Mac 或 Visual Studio Code 進行開發 | 使用 C#、VB 或 F# 通過 Visual Studio 進行開發 |
| 比 ASP.NET 性能更高 | 良好的性能 |
| 使用 .NET Core 運行時 | 使用 .NET Framework 運行時 |
開發環境
安裝.NET Core的開發環境,這里筆者用的是.NET 5.0 和VS 2019。下載地址:https://dotnet.microsoft.com/download 選擇自己的平台進行安裝。

這里簡單說下SDK和RunTime區別:
- SDK包含Runtime,用於開發,
- Runtime用於安裝運行。
安裝完成運行dotnet --list -sdk查看安裝情況。

新建項目
1.打開 VS2019,新建項目。

2.選擇ASP.NET Core API 應用,點擊下一步,然后創建項目。

3.此處選擇.NET 5.0 取消HTTPS勾選。

項目分析
1.整體分析

2.Startup類
Startup 類配置服務和應用請求管道:
- 包括 ConfigureServices 方法以配置應用的服務。 服務是一個提供應用功能的可重用組件。 在 ConfigureServices 中注冊服務,並通過依賴關系注入 (DI) 或 ApplicationServices 在整個應用中使用服務。
- 包括 Configure 方法以創建應用的請求處理管道。
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyWebAPI", Version = "v1" });
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyWebAPI v1"));
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
在應用啟動時,ASP.NET Core 運行時會調用 ConfigureServices 和 Configure。
Startup構造函數注入配置IConfiguration。
ConfigureServices方法是把自己或者第三方的服務注入到容器當中(ASP.NET Core 內部包含一整套自己的依賴注入框架),使其在應用和configure方法中可用,服務通過依賴注入或ApplicationServices 進行解析。
Configure方法用於指定應用響應 HTTP 請求的方式。 可通過將中間件組件添加到 IApplicationBuilder 實例來配置請求管道。
ASP.NET Core 模板默認配置管道:
- 開發人員異常頁
- 異常處理程序
- HTTP 嚴格傳輸安全性 (HSTS)
- HTTPS 重定向
- 靜態文件
- ASP.NET Core MVC 和 Razor Pages
3.依賴關系注入(服務)
ASP.NET Core 有內置的依賴關系注入 (DI) 框架,可在應用中提供配置的服務。 例如,日志記錄組件就是一項服務。
4.中間件
中間件是一種裝配到應用管道以處理請求和響應的軟件。 每個組件:
- 選擇是否將請求傳遞到管道中的下一個組件。
- 可在管道中的下一個組件前后執行工作
使用 RunMap 和 Use 擴展方法來配置請求委托。 可將一個單獨的請求委托並行指定為匿名方法(稱為並行中間件),或在可重用的類中對其進行定義。 這些可重用的類和並行匿名方法即為中間件,也叫中間件組件。 請求管道中的每個中間件組件負責調用管道中的下一個組件,或使管道短路。 當中間件短路時,它被稱為“終端中間件”,因為它阻止中間件進一步處理請求。
中間件請求過程

每個委托均可在下一個委托前后執行操作。 應盡早在管道中調用異常處理委托,這樣它們就能捕獲在管道的后期階段發生的異常。
5.服務器
Kestrel服務器是默認跨平台 HTTP 服務器實現。 Kestrel 提供了最佳性能和內存利用率,但它沒有 HTTP.sys 中的某些高級功能。
IIS HTTP 服務器是 IIS 的進程內服務器。
| Kestrel | HTTP.sys |
|---|---|
| 更好的性能和內存利用率。 | 端口共享 |
| 跨平台 | 內核模式 Windows 身份驗證。 Kestrel 僅支持用戶模式的身份驗證。 |
| 靈活性,它是獨立於操作系統進行開發和修補的。 | 通過隊列傳輸的快速代理 |
| 編程端口和 TLS 配置 | 直接文件傳輸 |
| 擴展性,允許 PPv2 等協議和備用傳輸。 | 響應緩存 |
6.路由
路由負責匹配傳入的 HTTP 請求,然后將這些請求發送到應用的可執行終結點。所有 ASP.NET Core 模板都包括生成的代碼中的路由。 路由在 Startup.Configure 中的中間件管道中進行注冊。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
}
7.錯誤處理
app.UseDeveloperExceptionPage置於中間件管道的前面部分,它能夠捕獲隨后中間件中拋出的未經處理的異常(這里用於開發環境檢測錯誤)。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
后記
終於寫完了整個計划的第一篇,算是一個好的開始吧,畢竟心心念念這么久才邁出了第一步,希望以后自己堅持下去記錄自己的學習,然后能幫助一兩人,共同前行。最后祝賀大家中秋快樂!
