# .Net Core Web API 基本教學 --- ## 基本簡介 ---- ### 什麼是 .Net Core * 微軟開發的第一個<span style="color:red">跨平台</span>的應用程式開發框架 * 為 <span style="color:red">.NET 5 +</span> 之前版本的名稱 * .NET Core 1.0、1.1、2.0、2.1、2.2、3.0、3.1 * .NET 5、6 Note: * 為甚麼使用 3.1 * .NET 6 為較新版本,資源可能相對較少 * .NET 5 並不是長期支援版本,到今年 5 月 * 直接跳 .NET 5 避免跟 .NET Framework 4.X 搞混 ---- ### .Net Core 與 .NET Framework * <span style="color:red">.Net Core</span> 是 .NET Framework 的<span style="color:red">新一代版本</span> * .NET Framework 最新版本到 <span style="color:red">4.8</span> * 運行環境 * .NET Core 能在 <span style="color:red">Windows</span>、<span style="color:red">MacOS</span>、<span style="color:red">Linux</span> 上運行 * .NET Framework 只能在 <span style="color:red">Windows</span> 上運行 * .NET Core 會包含 .NET Framework 的類別庫 --- ## 安裝 SDK 與 Runtime Note: * 下載位置 : [Download .NET](https://dotnet.microsoft.com/en-us/download/dotnet) ---- ### SDK ( 用於<span style="color:red">開發建置</span> ) ![](https://i.imgur.com/q3hICKx.png) Note: * 本身包含 Runtime ---- ### Runtime ( 用於<span style="color:red">執行</span> ) ![](https://i.imgur.com/aPhMzgG.png) Note: * IIS 上執行須安裝 Hosting Bundle,包含 IIS runtime support --- ## 建立新專案 ---- ### Visual Studio 2022 ![](https://i.imgur.com/4YoGuUi.png) ---- ![](https://i.imgur.com/5ttyxuF.png) ---- ### Visual Studio Code ```shell= dotnet new webapi -o NETCoreWebAPITest ``` Note: * 在要放專案的目錄下執行此命令,例如 : source\repos\ * 或是建立專案名稱資料夾執行 `dotnet new webapi` --- ## 專案內容 ---- ### 檔案架構 ![](https://i.imgur.com/rAywGTB.png) * 相依性 : <span style="color:red">組件參考</span>、<span style="color:red">NuGet</span> * Controller : 控制器,用於<span style="color:red">處理 Web API 要求</span> * Program.cs : 程式的<span style="color:red">進入點</span> * Startup.cs : 負責<span style="color:red">基礎設定檔</span>的執行 Note: * 相依性 * 相依性的組件參考設定會記錄在 .csproj 中 * Controller * Controllers 主要處理路由、回應格式、寫 LOG * 另外註冊 Service 注入 Controller 來處理邏輯 * WeatherForecast.cs 可以放在 Models 資料夾裡 ---- ### 程式架構 #### Program.cs ![](https://i.imgur.com/q5pMYgf.png) * 呼叫 <span style="color:red">CreateHostBuilder</span> 建立 Web 的預設組態環境並載入 Startup Note: * 參考 : [ASP.NET Core 中的 .NET 泛型主機](https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-3.1) * 以前用 IWebHostBuilder,現在建議都用 IHostedBuilder 了 ---- #### Startup.cs : ConfigureServices ![](https://i.imgur.com/izwxFtD.png) * 由 Runtime 呼叫,<span style="color:red">負責向容器註冊 Service</span> * 一旦註冊了,所有類別都<span style="color:red">能向容器獲取此實例</span> * 註冊時<span style="color:red">可以決定該實例的生命週期</span>,分為三種 * AddTransient * AddScoped * AddSingleton Note: * 參考 : [ASP.NET Core 中的應用程式啟動](https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/startup?view=aspnetcore-3.1)、[.NET Core 中的相依性插入](https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1) * AddTransient : 週期為每次請求到請求結束,每次請求都是一個新的實例 * AddScoped : 週期為客戶端的連結到結束 * AddSingleton : 週期為應用程序的開始到結束,每個請求都使用相同實例 ---- #### Startup.cs : Configure ![](https://i.imgur.com/ERWx684.png) * 由 Runtime 呼叫,<span style="color:red">負責指定應用程式如何響應請求</span> * 可在此插入<span style="color:red">中介軟體</span> Note: * 參考 : [ASP.NET Core 中介軟體](https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1) * UseDeveloperExceptionPage : 回報應用程式執行階段錯誤 * UseHttpsRedirection : 會將 HTTP 要求重新導向到 HTTPS * UseRouting : 路由要求 * UseAuthorization : 授權使用者存取安全資源 * UseEndpoints : 將呼叫端點引導至要求方法 ---- ### Controller 如何使用 Service ---- #### 加入 Service ```csharp= public void ConfigureServices(IServiceCollection services) { ... services.AddSingleton<TestService>(); ... } ``` * Startup.cs : ConfigureServices ---- #### 使用 Service ```csharp= public class WeatherForecastController : ControllerBase { ... private TestService _service; public WeatherForecastController(TestService service) { _service = service; } ... } ``` * Controller ---- ### 路由 * 透過路由才能讓應用程式知道此次請求須<span style="color:red">交由哪個方法處理</span> * 為了<span style="color:red">讓使用者明瞭 API 是做甚麼的</span>,路由的設計也很重要 Note: * 參考 : [ASP.NET Core 中的路由](https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/routing?view=aspnetcore-3.1) ---- #### 在 Controller <span style="color:red">類別</span>套用屬性 ```csharp= [Route("[controller]")] public class WeatherForecastController : ControllerBase { ... } ``` * 常用屬性 : <span style="color:red">controller</span>、<span style="color:red">action</span> * 使用純文字或是和屬性<span style="color:red">混合使用</span>,例如 : ```csharp= [Route("api/[controller]/[action]")] ``` ---- #### 在 Action <span style="color:red">方法</span>套用屬性 ```csharp= [HttpGet] public IEnumerable<WeatherForecast> Get() { ... } ``` * 決定 HTTP 協議中<span style="color:red">傳送請求的方式</span> * HttpGet、HttpPost、HttpDelete、HttpPut * 接著加上路由,例如 : ```csharp= [HttpGet("product/{id:int}")] ``` * 不使用路由傳遞 : GET .../product?id=1 --- ## 套件分享 ---- ### Swagger * 透過產生器就可<span style="color:red">自動生成 API 文件</span>供對接者查看 * 也能透過文件進行<span style="color:red">線上測試</span> ```shell= Install-Package Swashbuckle.AspNetCore -Version 6.2.3 ``` Note: * 參考 : [Swashbuckle 與 ASP.NET Core 使用者入門](https://docs.microsoft.com/zh-tw/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-3.1&tabs=visual-studio) ---- #### Startup.cs : ConfigureServices ![](https://i.imgur.com/JCUAJoC.png) * Swagger 產生器,<span style="color:red">可產生一到多份檔案</span> * 產生 <span style="color:red">XML 檔</span> ---- #### <span style="color:red">註解</span>可以在文件上更<span style="color:red">詳細描述 API</span> ![](https://i.imgur.com/IvmFdH5.png) ![](https://i.imgur.com/lxhd3oq.png) Note: * 可以設定回傳格式、描述回應類型、要求範例... ---- #### Startup.cs : Configure ![](https://i.imgur.com/DXjcp7j.png) * <span style="color:red">UseSwagger 產生 JSON 檔</span>,位置 : /swagger/v1/swagger.json * <span style="color:red">UseSwaggerUI 產生網頁</span>,位置 : /swagger/index.html ---- ### NLog * 依日期時間<span style="color:red">記錄 Log</span> * 方便<span style="color:red">日後維護</span>或<span style="color:red">查看歷史呼叫紀錄</span> ```shell= Install-Package NLog -Version 4.7.15 Install-Package NLog.Web.AspNetCore -Version 4.14.0 ``` Note: * 參考 : [Getting started with ASP.NET Core 3](https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3) ---- #### 建立 nlog.config ![](https://i.imgur.com/FBXCYZM.png) * 包含<span style="color:red">加入 .net core 擴展</span>、<span style="color:red">設定目標</span>、<span style="color:red">設定規則</span> Note: * 參考 : [Configuration file](https://github.com/NLog/NLog/wiki/Configuration-file) ---- #### nlog.config 啟用複製 ![](https://i.imgur.com/1jRNsIb.png) Note: * 在發佈時,才會將設定好的 nlog.config 帶過去 ---- #### program.cs ![](https://i.imgur.com/cpQl3LX.png) ---- #### appsettings.json ![](https://i.imgur.com/ROFW0jP.png) * 這邊的 Default <span style="color:red">會覆蓋 nlog.config 的 minievel</span> Note: * 若這邊設定的層級較高,nlog.config 那邊的層級設為較低也不會記錄該層級 ---- #### 如何使用 ```csharp= private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; _logger.LogDebug("NLog injected into WeatherForecastController"); } ``` * LogCritical、LogError、LogWarning、LogInformation、LogDebug、LogTrace Note: * Critical : 致命 * Error : 錯誤 * Warning : 警告 * Information : 資訊 * Debug : 偵錯 * Trace : 追蹤 ---- ### 統一回復錯誤格式 * 避免使用者看到錯誤細節,方便其處理錯誤 ---- #### Startup.cs : Configure ```csharp= public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Unite/Error"); } } ``` ---- #### ErrorController ![](https://i.imgur.com/dCjF9Vi.png) --- ## 建置與執行 ---- ### Visual Studio Code 建置 ```shell= dotnet build ``` 建置與執行 ```shell= dotnet run ``` 建置與執行並監看檔案 ```shell= dotnet watch run ``` Note: * 預設網址為 : https://localhost:5001、http://localhost:5000/ * 可在 `Properties` > `launchSettings.json` 更改 --- ## 佈署 ---- ### 資料夾 * 只需將<span style="color:red">發佈出來的資料夾內容</span>放入<span style="color:red">站點的實體路徑</span>即可 ---- #### Visual Studio ![](https://i.imgur.com/uPDdRnc.png) ---- ![](https://i.imgur.com/TbGFewO.png) ---- ![](https://i.imgur.com/rJTNiya.png) Note: * 新增 : 新增設定檔 * 更多動作 : 重新命名、編輯、刪除 ---- #### Visual Studio Code ```shell= dotnet publish --configuration Release ``` * 路徑 : .\bin\Release\netcoreapp3.1\publish ---- ### 網頁伺服器 ( IIS ) ![](https://i.imgur.com/aM81Xh3.png) * 透過 Web Platform Installer 安裝 Web Deploy Note: * 參考 : [設定 Web Deploy 發行的網頁伺服器 (Web Deploy 處理常式) - 建立和設定 IIS 網站](https://docs.microsoft.com/zh-tw/aspnet/web-forms/overview/deployment/configuring-server-environments-for-web-deployment/configuring-a-web-server-for-web-deploy-publishing-web-deploy-handler#create-and-configure-an-iis-website) * 下載位置 : [Web Platform Installer](https://www.microsoft.com/web/downloads/platform.aspx) * 沒有看到佈署按鈕 : * 需安裝 `Web Deploy 3.6`、`Web Deploy 3.6 without bundled SQL support`、`Web Deploy 3.6 for Hosting Servers` * `開啟或關閉 Windows 功能` 需開啟 `IIS 管理服務` * 確認 `Web Deployment Agent Service`、`Web Management Service` 兩個服務有開啟 * `控制台/程式集/程式和功能` 中的 `Microsoft Web Deploy 3.6` 變更查看功能是否都有開啟 ---- ![](https://i.imgur.com/t1Z40vc.png) Note: * 可選擇其他身分或在 IIS 上建立使用者來避免發佈人員直接擁有管理者權限 * `指定發行伺服器連線的 URL` 須記下來 ---- #### Visual Studio 2022 ![](https://i.imgur.com/uw6SoBE.png) ---- ![](https://i.imgur.com/2ZddpmE.png) ---- ![](https://i.imgur.com/J9fZXoV.png) Note: * `目的地 URL` 為 IIS 上設定的 `指定發行伺服器連線的 URL` --- ## Q&A ---- ###### tags: `筆記` `簡報` `.Net Core` `WebAPI` `IIS`
{"metaMigratedAt":"2023-06-16T23:25:10.833Z","metaMigratedFrom":"YAML","title":".Net Core Web API 基本教學","breaks":true,"slideOptions":"{\"showNotes\":false}","description":"微軟開發的第一個<span style=\"color:red\">跨平台</span>的應用程式開發框架","contributors":"[{\"id\":\"2e19abf2-0834-44dc-b179-9e2e9c8c01f6\",\"add\":12846,\"del\":3149}]"}
    6604 views