--- tags: Xamarin --- # XAM05-建立本機 WebAPI 專案 ## 1.簡介 Web API ASP.NET Web API 是一個擴展的跨平台,用於構建基於 HTTP 的服務,這些服務可以在不同平台(如 iOS、Windows phone 和 Android)上不同應用裝置中執行。 它的工作方式或多或少與 ASP.NET MVC Web 應用程序相同,但例外的是它只支持 HTTP 協定。 ![](https://hackmd.io/_uploads/r1EBmhSyi.png) ## 2.建立 SQL Server 資料庫 ### 2.1 開啟 Microsoft SQL Server Management 18 ![](https://hackmd.io/_uploads/SJtumhByo.png) ### 2.2 輸入 伺服器名稱、登入帳號、密碼 後按 連線 ![](https://hackmd.io/_uploads/r1K5XnByi.png) ### 2.3 新增資料庫 在 資料庫 中按右鍵選擇 新增資料庫 ![](https://hackmd.io/_uploads/Hks2m3SJi.png) ### 24. 建立資料表 在 資料表 中按右鍵選擇 新增 / 資料表 ![](https://hackmd.io/_uploads/Hks07nrJs.png) 依下圖輸入欄位並按下 存檔 輸入資料表名稱 Users (注意 Id 欄位要設定主鍵及自動編號) ![](https://hackmd.io/_uploads/rJJgE2Sko.png) 資料表 Users 新增完成 ![](https://hackmd.io/_uploads/HJc-N3r1o.png) 資料表 Users 按右鍵選 編輯前 200 個資料列 ![](https://hackmd.io/_uploads/ry6zEhHyj.png) 隨意輸入一些範例資料 ![](https://hackmd.io/_uploads/B1pXVhS1s.png) ## 3.建立 ASP.Net Web API 專案 ### 3.1 開啟 Visual Studio 2022 ![](https://hackmd.io/_uploads/BkLIV3Hyo.png) ### 3.2 按下 建立新的專案 ![](https://hackmd.io/_uploads/BkoYN3Bko.png) ### 3.3 輸入專案範本過濾條件 C# Windows Web 選取 ASP.NET Web 應用程式 (.Net Framework) ![](https://hackmd.io/_uploads/r1msNhrJs.png) ### 3.4 設定專案屬性 專案名稱: WebAPIDemo 位置: D:\vs2022 (請先行建立) 解決方案名稱: WebAPIDemo ![](https://hackmd.io/_uploads/rkraVnr1i.png) 專案範本: Web API 進階:取消勾選設定 HTTPS ![](https://hackmd.io/_uploads/rJFCVnBJj.png) 在專案 WebAPIDemo 中勾選上方 顯示所有檔案 ![](https://hackmd.io/_uploads/SJtJBnBJi.png) ## 4.建立專案資料庫 Model ### 4.1 在資料夾 Models 中 加入 一個 新增項目 ![](https://hackmd.io/_uploads/B1mZH2Skj.png) ### 4.2 建立一個 ADO.NET 實體資料模型 項目 命名為 **WebAPIDemoModel** ![](https://hackmd.io/_uploads/SJf4ShSys.png) 模型內容選擇 來自資料庫的 EF Designer ![](https://hackmd.io/_uploads/Bk3Br3SJo.png) 選擇您的資料連接選 新增連接 資料來源選 Microsoft SQL Server 並按下 繼續 ![](https://hackmd.io/_uploads/HkkvHnS1o.png) 輸入 伺服器名稱 及 登入帳號、密碼 並選取 WebAPIDemo 資料庫 ![](https://hackmd.io/_uploads/SJ7jB3HJi.png) 勾選 是 並按下 Next ![](https://hackmd.io/_uploads/HyrnBnBJo.png) 版本選擇 Entity Framework 6.x ![](https://hackmd.io/_uploads/ryEaBnHJs.png) 勾選 Users 資料表並按下 Finish ![](https://hackmd.io/_uploads/B1MCSnHko.png) 安全性警告勾選 不要再顯示此訊息 並 關閉視窗 ![](https://hackmd.io/_uploads/HkN1I3Syi.png) ![](https://hackmd.io/_uploads/H1wyLhH1o.png) 專案 WebAPIDemo 執行 重建 ![](https://hackmd.io/_uploads/r15lIhHks.png) Models 中 加入 一個 新增資料夾 名為 MetadataModel ![](https://hackmd.io/_uploads/SklG8nrJs.png) ![](https://hackmd.io/_uploads/ryEfI3Hys.png) MetadataModel 中加入一個 類別 為 UsersMetadata ![](https://hackmd.io/_uploads/ry4QU2Byi.png) ![](https://hackmd.io/_uploads/B11E82Hys.png) UsersMetadata 類別程式如下 ```csharp= using System.ComponentModel.DataAnnotations; namespace WebAPIDemo.Models { [MetadataType(typeof(UsersMetadata))] public partial class Users { private class UsersMetadata { [Key] [Display(Name ="記錄ID")] public int Id { get; set; } [Display(Name = "姓名")] public string UserName { get; set; } [Display(Name = "登入密碼")] public string UserPassword { get; set; } [Display(Name = "電子信箱")] public string UserEmail { get; set; } } } } ``` ## 5.建立專案控制器 ApiController ### 5.1 在 Controllers 中加入一個控制器 ![](https://hackmd.io/_uploads/rJZYL2SJo.png) 在 Web API 中選取 具有讀取/寫入動作的 Web API 2 控制器 ,名稱為 UsersController ![](https://hackmd.io/_uploads/SJFcU3Syj.png) ![](https://hackmd.io/_uploads/B1hcL3Bkj.png) 開啟 UsersController.cs 在上方輸入以下程式 **using WebAPIDemo.Models;** ```csharp= using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using System.Web.Http; using WebAPIDemo.Models; using System.Data.Entity; using System.Web.Http.Description; ``` 修改 Get() 函式程式如下: ```csharp= /// <summary> /// 取得使用者列表 /// </summary> /// <returns></returns> [HttpGet] [Route("api/Users")] [AllowAnonymous] [ResponseType(typeof(IEnumerable<Users>))] public async Task<IHttpActionResult> GetUsers() { using (WebAPIDemoEntities db = new WebAPIDemoEntities()) { IEnumerable<Users> model = await db.Users.OrderBy(m => m.UserName).ToListAsync(); if (model == null) return NotFound(); return Ok(model); } } ``` 在瀏覽器中執行專案 ![](https://hackmd.io/_uploads/ryxJw3rko.png) 執行上方選單中的 API ![](https://hackmd.io/_uploads/Bk-ewhS1s.png) 執行 GET api/Users ![](https://hackmd.io/_uploads/HJWWD2Ski.png) 可查詢到 欄位結構 ![](https://hackmd.io/_uploads/BJMzvhHJi.png) 可查詢到 JSON 的資料格式 ![](https://hackmd.io/_uploads/BkEXwhSJj.png) 可查詢到 XML 的資料格式 ![](https://hackmd.io/_uploads/rkEEw3Hko.png) 修改網址為 http://localhost:xxxx/api/Users 可看到輸出為 XML 格式的資料 ![](https://hackmd.io/_uploads/SkBSPnHys.png) 開啟 Global.asax 檔案,在 Application_Start() 中加入以下程式 **GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();** ![](https://hackmd.io/_uploads/SyfPP3S1s.png) ```csharp= protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); } ``` 修改後再執行 http://localhost:xxxx/api/Users 可看到輸出已強制為 JSON 格式的資料 ![](https://hackmd.io/_uploads/HJKYPnBJj.png) 修改 Get(int id) 函式程式如下: ```csharp= /// <summary> /// 取得單一使用者資料 /// </summary> /// <param name="id">使用者id</param> /// <returns></returns> [HttpGet] [Route("api/Users")] [AllowAnonymous] [ResponseType(typeof(Users))] public async Task<IHttpActionResult> GetUser(int id) { using (WebAPIDemoEntities db = new WebAPIDemoEntities()) { Users model = null; try { model = await db.Users.Where(m => m.Id == id).FirstOrDefaultAsync(); } catch (Exception ex) { return BadRequest(ex.Message); } if (model == null) return NotFound(); return Ok(model); } } ``` 修改後再執行 http://localhost:xxxx/api/Users/1 可看到輸出記錄 Id 為 1 的資料 ![](https://hackmd.io/_uploads/B1xhD2H1i.png) 修改 Post(Users model) 函式程式如下: ```csharp= /// <summary> /// 新增一個使用者記錄 /// </summary> /// <param name="model">使用者結構及資料</param> /// <returns></returns> [HttpPost] [Route("api/Users")] [AllowAnonymous] [ResponseType(typeof(Users))] public async Task<IHttpActionResult> Post(Users model) { using (WebAPIDemoEntities db = new WebAPIDemoEntities()) { try { db.Users.Add(model); await db.SaveChangesAsync(); } catch (Exception ex) { return BadRequest(ex.Message); } return Ok(); } } ``` 修改 PUT(Users model) 函式程式如下: ```csharp= /// <summary> /// 修改一個使用者記錄 /// </summary> /// <param name="model">使用者結構及資料</param> /// <returns></returns> [HttpPut] [Route("api/Users")] [AllowAnonymous] [ResponseType(typeof(Users))] public async Task<IHttpActionResult> Put(Users model) { using (WebAPIDemoEntities db = new WebAPIDemoEntities()) { try { var user = db.Users.Where(m => m.Id == model.Id).FirstOrDefault(); if (user == null) return NotFound(); user.UserName = model.UserName; user.UserPassword = model.UserPassword; user.UserEmail = model.UserEmail; await db.SaveChangesAsync(); } catch (Exception ex) { return BadRequest(ex.Message); } return Ok(); } } ``` 修改 Delete(int id) 函式程式如下: ```csharp= /// <summary> /// 刪除一個使用者記錄 /// </summary> /// <param name="id">使用者id</param> /// <returns></returns> [HttpDelete] [Route("api/Users")] [AllowAnonymous] public async Task<IHttpActionResult> Delete(int id) { using (var db = new WebAPIDemoEntities()) { try { var user = db.Users.Where(m => m.Id == id).FirstOrDefault(); if (user == null) return NotFound(); db.Users.Remove(user); //db.Entry(user).State = EntityState.Deleted; await db.SaveChangesAsync(); } catch (Exception ex) { return BadRequest(ex.Message); } return Ok(); } } ``` ## 6.發行專案到本機 IIS 中 專案發行時 Visual Studio 2022 需要使用 管理員身份 開啟才能發行成功, 若不是管理員身份請關閉重新開啟 ![](https://hackmd.io/_uploads/rJrLT3H1i.png) ![](https://hackmd.io/_uploads/SkYLp3rJj.png) 在上方工具列空白處按右鍵選取 Web 單鍵發佈 ![](https://hackmd.io/_uploads/Bk9P63BJs.png) 選取專案 WebAPIDemo 按下上方 發佈 下拉選單 , 選取 <新增自訂設定檔> ![](https://hackmd.io/_uploads/HyhuanS1o.png) 目標 選取 網頁伺服器(IIS) ![](https://hackmd.io/_uploads/ByFKTnBJj.png) 特定目標 選取 Web Deploy ![](https://hackmd.io/_uploads/BkecqT3HJj.png) 伺服器: http://localhost 網站名稱: Default Web Site/WebAPIDemo 目的地 URL: http://localhost/WebAPIDemo/api/Users ![](https://hackmd.io/_uploads/Byb36hBks.png) 重新命名發行設定檔為:localhost_web_deploy ![](https://hackmd.io/_uploads/BJNpanByo.png) ![](https://hackmd.io/_uploads/B1F6ThHyo.png) 發行 專案到 本機 IIS 中 ![](https://hackmd.io/_uploads/B1CR63Hyj.png) ![](https://hackmd.io/_uploads/rk-yAnHko.png)