Day01 20191201 ASP․NET Core 3 開發實戰:從入門到進階 (台北)

ASP.NET Core 3 開發實戰:從入門到進階 實作環境說明

:+1: 課程附件

請先安裝 Chocolatey 套件管理器,並以系統管理員身分開啟 CMD 命令提示字元,並執行以下命令:

choco install clink -y mkdir c:\Projects cd /d c:\Projects git clone https://github.com/doggy8088/clink-completions.git cd clink-completions install.bat

:+1: 課程附件

建議各位同學安裝 Open in Visual Studio Code 擴充套件 (VS2019),這個套件可以讓你快速從 Visual Studio 2019 裡面直接開啟 Visual Studio Code 工具,並自動開啟目前專案資料夾! 👍
如此一來,就可以在 Visual Studio 2019 缺乏好用工具 (Code Snippets) 的情況下,改用 Visual Studio Code 撰寫程式碼! 😃

Open in Visual Studio Code

  • Chrome 快捷鍵 SHIFT + ESC  可以查看Chrome的工作管理員

NET的版本

.NET Core支援週期
.Net Core 支援原則 參考表

版本 支援時間 備註
Current 三個月 第一次釋出的時間往後推三個月,時間到就不更新了 會標示End of life
LTS 三年

:+1: 保哥技術分享

示範如何鎖定 .NET Core SDK 版本

dotnet new globaljson --sdk-version 3.0.101

你可以用以下命令查詢已安裝的 SDK 版本清單:

dotnet --list-sdks

如何在多個 .NET Core SDK 版本之間進行切換 (global.json)

3.0升到3.1很簡單 只需要改一個地方,
只需要將Csproj檔裡的 TargetFramework 標籤中,
netcoreapp3.0 改為 netcoreapp3.1

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

.NET Core 新手上路

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

  • 先建立並進入一個空白資料夾
  • mkdir solution1
  • cd solution1
  • dotnet new -l 列出可以建立的專案清單
  • dotnet new console -o console1 -o:輸出到資料夾
  • cd console1
  • 編輯 Program.cs
  • 查看 console1.csproj
  • dotnet restore
  • dotnet build 建置.NET Core 應用程式
  • dotnet run 從專案目錄直接執行應用程式(會自動建置)
  • dotnet clean 清除建置時所輸出的相關檔案
  • dotnet publish -c Release 發行.NET Core 應用程式
  • dotnet bin\Release\netcoreapp3.0\console1.dll

指令
Release出現的檔案中裡面的.exe檔案 其實只是執行
dotnet console1.dll

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

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

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

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

.NET Standard

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

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

  • 版本越新,可供您使用的 API 就越多。
  • 版本越舊,可實作它的平台就越多。

.NET Standard

版本規則

  • 新版本的API 只增不減( Additive )
  • 舊版本的API 絕不改變( Immutable)

多目標架構(Multi-TargetFrameworks)

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

官方資料

作法:

  • TargetFramework=>TargetFrameworks
  • 以分號隔開版本
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks> <RootNamespace>ApiPortVS</RootNamespace> <DefineConstants>$(DefineConstants);VS2019</DefineConstants> </PropertyGroup>

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

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

這時再重新編譯會發現,成功編譯了!
link text

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

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

請參考附件連結

  • TargetFramework=>TargetFrameworks
  • 以分號隔開版本
<TargetFrameworks> netstandard2.0;net472 </TargetFrameworks>
#if NET472 #elif #else #endif
<TargetFrameworks> netstandard2.0;netcoreapp3.0 </TargetFrameworks>
#if NETCOREAPP3_0 return "netcoreapp3.0"; #else return "netstandard2.0"; #endif
  • dotnet pack solution1.sln

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

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

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

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

單元測試比較麻煩一些,package.JSON定義了nuget裡面安裝了哪些package
所以需要比較一下,這些套件再剛剛單元測試裡面有沒有出現,如果沒有出現,就需要自己想辦法加進去

  1. 建立新專案
  2. 將csproj,appconfig,obj 資料夾,bin 資料夾以外的檔案搬過去 (特別注意 Properties/AssemblyInfo.cs )
  3. 修正套件版本(單元測試專案有package.config)
  • build時遇到屬性重複的問題:AssemblyInfo.cs裡面Assembly開頭的砍掉
    (早起的.netFrameWork的Properties裡面會有AssemblyInfo定義了產品名稱等等,到了.net core的時候這些資訊都被整併到csproject檔案裡面)
    所以升級的時候就把這些程式碼都刪掉,因為這些assembly的project檔案實際上在.net core編譯時期會自動把assembly這些資訊編譯到project檔案裡面,不過這個過程是看不到的
[assembly: AssemblyTitle("NeuralNetworkCSharp")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("NeuralNetworkCSharp")] [assembly: AssemblyCopyright("Copyright © 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")]
  • 在被測的專案的AssemblyInfo.cs裡面[assembly: InternalsVisibleTo("NeuralNetworkCSharpTests")]的專案名稱要跟你新建的測試專案名稱一樣
    C# 存取修飾詞 - internal

:+1: 保哥技術分享

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

"files.associations": {
    "*.csproj": "msbuild"
},

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

:+1: 保哥技術分享

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

image alt

vs code 常使用的快速鍵

.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
一般只需要記得最常用的三個

  1. win-x64
  2. linux-x64
  3. 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

:+1: 保哥技術分享

今天課程提到一個 .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/

:memo: 練習不同的發布方法

  • 注意類別庫專案不會產出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,不可用組字串的方式

image alt

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端把結果算好,再傳送至前端

link text

:+1: 保哥技術分享

如果想在 Windows PowerShell 或 Bash/Zsh 環境下使用命令列自動完成,請參考這篇文章進行設定喔! 👍
#macOS也能用命令列自動完成
參考資料

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