--- tags: ASP․NET Core 3 開發實戰:從入門到進階 (台北) --- # Day01 20191201 ASP․NET Core 3 開發實戰:從入門到進階 (台北) [ASP.NET Core 3 開發實戰:從入門到進階 實作環境說明](https://gist.github.com/doggy8088/5fbeadb4c03eb61153e44256b263d89a?fbclid=IwAR0MX5FbbqDBkKyB4vUlXUZu0kQjwdQBw1usPsnNvB_SF_ESVEKxKtnxHfI) ### :+1: 課程附件 請先安裝 Chocolatey 套件管理器,並以系統管理員身分開啟 CMD 命令提示字元,並執行以下命令: ```shell= 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](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.OpeninVisualStudioCode&fbclid=IwAR3jlabKV3t_-rzYxeN9JpSl7741-ermPlL9EV8cfIlGUV5Qj101AuTghDM) * Chrome 快捷鍵 SHIFT + ESC  可以查看Chrome的工作管理員 ## NET的版本 [.NET Core支援週期](https://dotnet.microsoft.com/download/dotnet-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)](https://blog.miniasp.com/post/2018/04/19/How-to-switch-between-DotNet-SDK-versions?fbclid=IwAR2eE2e0IEy2bHDV_sAW5rYf8unudFK_KBx0oFjuq62l_0fDm7bpvyliMOI) 3.0升到3.1很簡單 只需要改一個地方, 只需要將Csproj檔裡的 TargetFramework 標籤中, netcoreapp3.0 改為 netcoreapp3.1 ![](https://i.imgur.com/ji4M6Lu.png) ## .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` ![指令](https://i.imgur.com/qBw1Z2C.png) Release出現的檔案中裡面的.exe檔案 其實只是執行 `dotnet console1.dll` ![](https://i.imgur.com/WuzYL5R.png) ## :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](https://gist.github.com/doggy8088/7a205f7c251fd65f328ebd29537df436#file-class1-cs).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](https://gist.github.com/doggy8088/7a205f7c251fd65f328ebd29537df436#file-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 <font color ="red">**.NET Framework 微軟已經沒再更新了**</font> 選擇 .NET Standard 版本時,您應該考量下列取捨: * 版本越新,可供您使用的 API 就越多。 * 版本越舊,可實作它的平台就越多。 ![.NET Standard](https://i.imgur.com/eK5SVHV.png) ### 版本規則 * 新版本的API 只增不減( Additive ) * 舊版本的API 絕不改變( Immutable) ### 多目標架構(Multi-TargetFrameworks) 可以讓一份sorce code 產生多版本的dll檔案 [官方資料](https://docs.microsoft.com/zh-tw/nuget/create-packages/multiple-target-frameworks-project-file) #### 作法: * TargetFramework=>TargetFrameworks * 以分號隔開版本 ```csharp= <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks> <RootNamespace>ApiPortVS</RootNamespace> <DefineConstants>$(DefineConstants);VS2019</DefineConstants> </PropertyGroup> ``` 使用 Visual Studio 2019 只需要在專案上點兩下就可直接編輯 .csproj 專案檔。 ![](https://i.imgur.com/Zxfvw2m.png) 設定完成後,Visual Studio 2019 會提示必須重新 Reload 所有專案、這時點選 Yes 即可。 這時再重新編譯會發現,成功編譯了! ![link text](https://i.imgur.com/InhbIQg.png) 這時候在進入relase資料夾底下可以看到產生兩個資料夾 ## :memo:練習: 將 net standard專案支援多版本 [請參考附件連結](https://docs.microsoft.com/zh-tw/dotnet/standard/frameworks?fbclid=IwAR0wjjTP--URk8AlmPqLxDBFRgGqVkVdFoRbbae-TGXsXYIeohDZk-diuWI) - `TargetFramework`=>`TargetFrameworks` - 以分號隔開版本 ```xml= <TargetFrameworks> netstandard2.0;net472 </TargetFrameworks> ``` ```csharp= #if NET472 #elif #else #endif ``` ```xml= <TargetFrameworks> netstandard2.0;netcoreapp3.0 </TargetFrameworks> ``` ```csharp= #if NETCOREAPP3_0 return "netcoreapp3.0"; #else return "netstandard2.0"; #endif ``` - `dotnet pack solution1.sln` ![](https://i.imgur.com/DrVRnal.png) - 用zip開啟 .nupkg 可看到兩個版本 ## :memo: 練習: 將 .net framework 4.6.1 專案升級為 .net standard 2.0 升級專案的簡單幾個步驟: 1. 建立兩個新專案 2. 將CsProject以外的所有檔案Copy到新專案裡面去 3. 修改套件版本 單元測試比較麻煩一些,package.JSON定義了nuget裡面安裝了哪些package 所以需要比較一下,這些套件再剛剛單元測試裡面有沒有出現,如果沒有出現,就需要自己想辦法加進去 - P.41 - https://github.com/coolrare/SimpleNeuralNetworkInCSharp 1. 建立新專案 2. 將csproj,appconfig,obj 資料夾,bin 資料夾以外的檔案搬過去 (特別注意 Properties/AssemblyInfo.cs ) ![](https://i.imgur.com/OS9n7VY.png) 4. 修正套件版本(單元測試專案有package.config) - build時遇到屬性重複的問題:AssemblyInfo.cs裡面Assembly開頭的砍掉 (早起的.netFrameWork的Properties裡面會有AssemblyInfo定義了產品名稱....等等,到了.net core的時候這些資訊都被整併到csproject檔案裡面) 所以升級的時候就把這些程式碼都刪掉,因為這些assembly的project檔案實際上在.net core編譯時期會自動把assembly這些資訊編譯到project檔案裡面,不過這個過程是看不到的 ```csharp= [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](https://blog.johnwu.cc/article/c-sharp-access-modifiers-internal.html) ### :+1: 保哥技術分享 設定讓 Visual Studio Code 開啟 *.csproj 的時候,自動切換到 MSBuild 語言模式,請參考一下 VSCode 設定值: ``` "files.associations": { "*.csproj": "msbuild" }, ``` **按下 Ctrl+, 就可以開啟設定視窗** ### :+1: 保哥技術分享 你只要在 Visual Studio Code 中使用**滑鼠右鍵點選** *.csproj 檔案,就可以直接 **建置** (Build)、**執行** (Run) 或 **執行測試 **(Tests) 👍 ![image alt](https://scontent.ftpe8-4.fna.fbcdn.net/v/t1.0-9/78230928_10221102680106947_6381741452422021120_n.jpg?_nc_cat=102&_nc_sid=ca434c&_nc_ohc=DZCqivVOypQAX-a7_Tj&_nc_ht=scontent.ftpe8-4.fna&oh=0684b952b4266de05eb6d610f3c10173&oe=5E82A94A) ### vs code 常使用的快速鍵 - `ctrl` + `shift`+`b` 可以直接build - `ctrl` + `space` 可以跳出提示,但要修正輸入法 - `ctrl` + `,` - `ctrl` + `.` - 容易被新注音輸入法吃掉建議修改以下設定[Windows 8 小技巧: 繁體中文語言如何變更預設輸入法(英文) | The Will Will Web](https://blog.miniasp.com/post/2012/06/30/Windows-8-Tips-How-to-change-default-input-method-for-languages?fbclid=IwAR2MqFpOQPWsKSsUMkd6R3Jzydsr1QVpeCc1xwWO7sz1tMi4XMghpBp39Po) ## .Net Core 應用程式部署方法 .net core 真正的主程式是.dll檔,產生的exe 裡面其實只是在執行.dll檔 - Framework 相依部署 (FDD) => **.net core 2.2以前預設** ```shell= dotnet publish -c Release -p:UseAppHost=false ``` - Framework 相依可執行檔 (FDE) ```shell= dotnet publish -c Release -r <RID> --no-self-contained ``` - 自封式部署 (SCD) 適合電腦環境不是自己能控制的地方 :::info -r = runtimes的意思 可以針對,特定作業系統產生runtimes所需要的dll檔 缺點:檔案太大 優點:不用再安裝.net core平台 ::: 可以透過dotnet --info 查RID 一般只需要記得最常用的三個 1. win-x64 2. linux-x64 3. osx-x64 **樹梅派 可以跑 .net core 不過速度很慢** ```shell= 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會跳錯 :::success UNIT 1 • 練習實作進度回報 ::: **請先建立 ASP․NET Core MVC 專案** ```shell= dotnet new mvc -n m1 cd m1 ``` 然後練習不同的 .NET Core 發行方法 ```shell= 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](https://marcus116.blogspot.com/2019/03/netcore-aspnet-core-kestrel-web-server.html) .NetCore 可以透過 Kestrel直接對外連線 * 優點:執行速度特別快 (但是官方不建議這麼使用) * 缺點:沒有任何保護,可能會有安全性的弱點 `參數化的方式可以避免sql injection,不可用組字串的方式` ![image alt](https://3.bp.blogspot.com/-Q0FPncsFRBg/XI44bYjvk6I/AAAAAAAAGSY/YLHD6aTxRIIhOdflcLK3vXBZdxWDKCUXwCLcBGAs/s1600/kestrel7.png) ## 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](https://docs.microsoft.com/en-us/aspnet/core/blazor/index/_static/blazor-server.png?view=aspnetcore-3.1) ### :+1: 保哥技術分享 如果想在 Windows PowerShell 或 Bash/Zsh 環境下使用命令列自動完成,請參考這篇文章進行設定喔! 👍 #macOS也能用命令列自動完成 [參考資料](https://docs.microsoft.com/en-us/dotnet/core/tools/enable-tab-autocomplete?fbclid=IwAR1w5GK46XTQ21gI4zMvPDEL_Pw4JiDFcZg_W-LTnmsB8K3GW4FjJUos8HA) [ASP.NET Core 3 開發實戰:從入門到進階 (第一天學習評量測驗)](https://forms.office.com/Pages/ResponsePage.aspx?id=FVMndnV6rUubfaMp1iIhUP7AkqFxUMVEuJonzvlprbxUM0M3TlE1WlpIMlpOM0xVMzlNVElOMDhSUC4u&utm_source=Facebook_PicSee&fbclid=IwAR3WO65eveLe1fMVCLrWoqHcoGLxaIIxB1GnS_ulU2whjq3Gp612BfOcFN4)