Day01 20191201 ASP․NET Core 3 開發實戰：從入門到進階 (台北)
By: Nick Chi
Tags: Dotnet, Dotnet Core

.NET Core 新手上路

🔨練習:用 .NET Core CLI 建立 .NET Core主控台專案

先建立並進入一個空白資料夾

mkdir solution1

cd solution1

dotnet new -l 列出可以建立的專案清單

列出可以建立的專案清單 dotnet new console -o console1 -o:輸出到資料夾

-o:輸出到資料夾 cd console1

編輯 Program.cs

查看 console1.csproj

dotnet restore

dotnet build 建置.NET Core 應用程式

建置.NET Core 應用程式 dotnet run 從專案目錄直接執行應用程式(會自動建置)

從專案目錄直接執行應用程式(會自動建置) dotnet clean 清除建置時所輸出的相關檔案

清除建置時所輸出的相關檔案 dotnet publish -c Release 發行.NET Core 應用程式

發行.NET Core 應用程式 dotnet bin\Release

etcoreapp3.0\console1.dll

Release出現的檔案中裡面的.exe檔案 其實只是執行

dotnet console1.dll

🔨練習:用 .NET Core CLI 建立 .NET Standard專案

cd.. (回到Solution1資料夾) dotnet new classlib -o classlib1 -f netcoreapp2.2 如果沒加 -f netcoreapp2.2 默認是2.0 cd classlib1 編輯Class1.cs 任意原始碼(請新增一個Go()方法並回傳字串) 查看classlib1.csproj(請注意TargetFramework 屬性) dotnet bulid dotnet build -c Release dotnet msbuild /p:Configuration=Release dotnet clean dotnet pack 打包Nutget套件 dotnet publish dotnet publish -c Release dotnet msbuild /t:Publish /p:Configuration=Release

🔨練習:用 .NET Core CLI 建立 .NET Core單元測試

cd.. (回到solution1資料夾) dotnet new mstest -n classlib1.test cd classlib1.test dotnet add reference ..\classlib1\classlib1.csproj 編輯UnitTest1.cs單元測試檔 查看classlib1.test.csproj(請注意 TargetFramework 屬性) dotnet test -t (列出專案中所有測試案例) dotnet test (執行測試) dotnet build dotnet vstest bin\Debug

etcoreapp3.0\classlib1.test.dll

.NET Standard

.NET Framework 微軟已經沒再更新了

選擇 .NET Standard 版本時，您應該考量下列取捨：

版本越新，可供您使用的 API 就越多。

版本越舊，可實作它的平台就越多。

版本規則

新版本的API 只增不減( Additive )

舊版本的API 絕不改變( Immutable)

多目標架構(Multi-TargetFrameworks)

可以讓一份sorce code 產生多版本的dll檔案

官方資料

作法：

TargetFramework=>TargetFrameworks

以分號隔開版本

使用 Visual Studio 2019 只需要在專案上點兩下就可直接編輯 .csproj 專案檔。

設定完成後，Visual Studio 2019 會提示必須重新 Reload 所有專案、這時點選 Yes 即可。

這時再重新編譯會發現，成功編譯了！

這時候在進入relase資料夾底下可以看到產生兩個資料夾

🔨練習: 將 net standard專案支援多版本

請參考附件連結

TargetFramework => TargetFrameworks

=> 以分號隔開版本

dotnet pack solution1.sln

用zip開啟 .nupkg 可看到兩個版本

🔨練習: 將 .net framework 4.6.1 專案升級為 .net standard 2.0

升級專案的簡單幾個步驟：

建立兩個新專案 將CsProject以外的所有檔案Copy到新專案裡面去 修改套件版本

單元測試比較麻煩一些，package.JSON定義了nuget裡面安裝了哪些package

所以需要比較一下，這些套件再剛剛單元測試裡面有沒有出現，如果沒有出現，就需要自己想辦法加進去

建立新專案 將csproj,appconfig,obj 資料夾,bin 資料夾以外的檔案搬過去 (特別注意 Properties/AssemblyInfo.cs )

3. 修正套件版本(單元測試專案有package.config)

📓保哥技術分享

設定讓 Visual Studio Code 開啟 *.csproj 的時候，自動切換到 MSBuild 語言模式，請參考一下 VSCode 設定值：

"files.associations": {

"*.csproj": "msbuild"

},

按下 Ctrl+, 就可以開啟設定視窗

📓保哥技術分享

你只要在 Visual Studio Code 中使用滑鼠右鍵點選 *.csproj 檔案，就可以直接 建置 (Build)、執行 (Run) 或 **執行測試 **(Tests) 👍

vs code 常使用的快速鍵

ctrl + shift + b 可以直接build

+ + 可以直接build ctrl + space 可以跳出提示，但要修正輸入法

+ 可以跳出提示，但要修正輸入法 ctrl + ,

+ ctrl + .

+ 容易被新注音輸入法吃掉建議修改以下設定Windows 8 小技巧: 繁體中文語言如何變更預設輸入法(英文) | The Will Will Web

.Net Core 應用程式部署方法

.net core 真正的主程式是.dll檔，產生的exe 裡面其實只是在執行.dll檔

Framework 相依部署 (FDD) => .net core 2.2以前預設

dotnet publish -c Release -p:UseAppHost=false

Framework 相依可執行檔 (FDE)

dotnet publish -c Release -r <RID> --no-self-contained

自封式部署 (SCD)

適合電腦環境不是自己能控制的地方

-r = runtimes的意思

可以針對，特定作業系統產生runtimes所需要的dll檔

缺點：檔案太大

優點：不用再安裝.net core平台

可以透過dotnet — info 查RID

一般只需要記得最常用的三個

win-x64 linux-x64 osx-x64

樹梅派 可以跑 .net core 不過速度很慢

dotnet publish -c Release -r <RID> --self-contained

dotnet publish -c Release -r <RID> -p:PublishSingleFile=true

dotnet publish -c Release -r <RID> -p:PublishTrimmed=true -PublishTrimmed=true 會幫你把沒用到的code移除掉 可以減少檔案大小

-PublishSingleFile 幫你壓縮成一個檔案

- -p:PublishSingleFile=true執行的時候，會自動解壓縮到特定目錄

1.windows command line => %TMP%\.net\

2.windows powershell => $env:TMP\.net

3.linux => /var/tmp/.net/

4.osx => $TMPDIR.net

📓保哥技術分享

今天課程提到一個 .NET Core 發行的命令：

dotnet publish -c Release -r <RID> -p:PublishSingleFile=true

他會將 SCD 佈署的所有檔案壓縮成一支可執行檔，但執行的時候，會自動解壓縮到特定目錄，我特別找出這個目錄的位置 (如下)，如果以後硬碟不夠用的時候，可以從以下目錄找出這些暫存檔案，隨時可以安全的移除這個目錄下的所有檔案！

命令提示字元

%TMP%\.net\

Windows PowerShell

$env:TMP\.net

Linux bash (請同學幫忙驗證一下 macOS 的路徑)

/var/tmp/.net/

🔨練習不同的發布方法

注意類別庫專案不會產出exe…用self contained會跳錯

UNIT 1 • 練習實作進度回報

請先建立 ASP․NET Core MVC 專案

dotnet new mvc -n m1

cd m1

然後練習不同的 .NET Core 發行方法

dotnet publish -c Release -p:UseAppHost=false dotnet publish -c Release -r <RID> --no-self-contained dotnet publish -c Release -r <RID> --self-contained

dotnet publish -c Release -r <RID> -p:PublishSingleFile=true

dotnet publish -c Release -r <RID> -p:PublishTrimmed=true

Asp .Net Core開發實戰

可以裝載 .NET CORE的執行環境

Kestrel: .NET CORE內建的高速伺服器，雖然可以直接開PORT對外，但微軟不建議這樣做，通常還是會再配合其他的(IIS/NGINX/APACHE…)

ASP.NET Core — Kestrel Web Server

.NetCore 可以透過 Kestrel直接對外連線

優點：執行速度特別快 (但是官方不建議這麼使用)

缺點：沒有任何保護，可能會有安全性的弱點

參數化的方式可以避免sql injection,不可用組字串的方式

asp .net core 包含哪些東西

SignalR(簡單來說是一個即時連線的應用程式)：實作了四種不同的通訊協定（包含 Web Socket），只要與伺服器建立連線後，使用者便不太需要擔心斷線重連的問題；另外因實作多種通訊協定，IE即使不支援Web Socket也能自行換一種通訊協定連線。

適合應用的情境：聊天室、即時的報表監控、客服系統

官方有做壓測過可以百萬人連線

Blazor：一種基於WSS的框架，可以使用C#做到類似JavaScript的效果。傳統的WebForm或MVC會傳整個View回來client端，但Blazor只會傳最少量的東西(通常是有變動的值和畫面)回來client端，這意味著Blazor的效能較佳。曾有實驗壓測速度能支援 1 核心到 2 萬人連線。

利用WebAssembly的技術讓c#的dll檔直接跑在瀏覽器上，想要做到離線會有機會用到

BlazorService 會用WebSocket 切換頁面時事實上是在service端把結果算好，再傳送至前端

📓保哥技術分享

如果想在 Windows PowerShell 或 Bash/Zsh 環境下使用命令列自動完成，請參考這篇文章進行設定喔！ 👍

#macOS也能用命令列自動完成

參考資料

ASP.NET Core 3 開發實戰：從入門到進階 (第一天學習評量測驗)