--- tags: Xamarin --- # XAM05-建立本機 WebAPI 專案 ## 1.簡介 Web API ASP.NET Web API 是一個擴展的跨平台,用於構建基於 HTTP 的服務,這些服務可以在不同平台(如 iOS、Windows phone 和 Android)上不同應用裝置中執行。 它的工作方式或多或少與 ASP.NET MVC Web 應用程序相同,但例外的是它只支持 HTTP 協定。  ## 2.建立 SQL Server 資料庫 ### 2.1 開啟 Microsoft SQL Server Management 18  ### 2.2 輸入 伺服器名稱、登入帳號、密碼 後按 連線  ### 2.3 新增資料庫 在 資料庫 中按右鍵選擇 新增資料庫  ### 24. 建立資料表 在 資料表 中按右鍵選擇 新增 / 資料表  依下圖輸入欄位並按下 存檔 輸入資料表名稱 Users (注意 Id 欄位要設定主鍵及自動編號)  資料表 Users 新增完成  資料表 Users 按右鍵選 編輯前 200 個資料列  隨意輸入一些範例資料  ## 3.建立 ASP.Net Web API 專案 ### 3.1 開啟 Visual Studio 2022  ### 3.2 按下 建立新的專案  ### 3.3 輸入專案範本過濾條件 C# Windows Web 選取 ASP.NET Web 應用程式 (.Net Framework)  ### 3.4 設定專案屬性 專案名稱: WebAPIDemo 位置: D:\vs2022 (請先行建立) 解決方案名稱: WebAPIDemo  專案範本: Web API 進階:取消勾選設定 HTTPS  在專案 WebAPIDemo 中勾選上方 顯示所有檔案  ## 4.建立專案資料庫 Model ### 4.1 在資料夾 Models 中 加入 一個 新增項目  ### 4.2 建立一個 ADO.NET 實體資料模型 項目 命名為 **WebAPIDemoModel**  模型內容選擇 來自資料庫的 EF Designer  選擇您的資料連接選 新增連接 資料來源選 Microsoft SQL Server 並按下 繼續  輸入 伺服器名稱 及 登入帳號、密碼 並選取 WebAPIDemo 資料庫  勾選 是 並按下 Next  版本選擇 Entity Framework 6.x  勾選 Users 資料表並按下 Finish  安全性警告勾選 不要再顯示此訊息 並 關閉視窗   專案 WebAPIDemo 執行 重建  Models 中 加入 一個 新增資料夾 名為 MetadataModel   MetadataModel 中加入一個 類別 為 UsersMetadata   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 中加入一個控制器  在 Web API 中選取 具有讀取/寫入動作的 Web API 2 控制器 ,名稱為 UsersController   開啟 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); } } ``` 在瀏覽器中執行專案  執行上方選單中的 API  執行 GET api/Users  可查詢到 欄位結構  可查詢到 JSON 的資料格式  可查詢到 XML 的資料格式  修改網址為 http://localhost:xxxx/api/Users 可看到輸出為 XML 格式的資料  開啟 Global.asax 檔案,在 Application_Start() 中加入以下程式 **GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();**  ```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 格式的資料  修改 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 的資料  修改 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 需要使用 管理員身份 開啟才能發行成功, 若不是管理員身份請關閉重新開啟   在上方工具列空白處按右鍵選取 Web 單鍵發佈  選取專案 WebAPIDemo 按下上方 發佈 下拉選單 , 選取 <新增自訂設定檔>  目標 選取 網頁伺服器(IIS)  特定目標 選取 Web Deploy  伺服器: http://localhost 網站名稱: Default Web Site/WebAPIDemo 目的地 URL: http://localhost/WebAPIDemo/api/Users  重新命名發行設定檔為:localhost_web_deploy   發行 專案到 本機 IIS 中  
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up