ASP.Net MVC在第四版,也就是MVC 4提供了一個嶄新的東西-WebAPI。其實這個東西早在以前的WCF就推出了,只是當時在整個WCF中它僅是其中的一個分支,而在WCF中它是一種Http服務,但畢竟WCF的龐大是眾所周知,而區區一個Http 服務在WCF眼裡看來當然顯得有些微不足道。在當時,Http並非是WCF的唯一新寵但是卻也讓大家耳目一新,不過在大家興高采烈的想要馬上做幾個範例時,在複雜的組態檔設定面前,大家都卻步了。
Http服務是一種趨勢,它原本是想要試著去做到REST架構,提供開發人員與前端設計人員以一種方便又快速的方式存取後端服務所提供的資源,但是Html5襲捲全球開發人員之後Http服務更是水漲船高。微軟在Visual Studio的設計上從以前到現在都是一直朝著讓開發人員便利且快速開發專案為目標,而這位未來的新寵兒勢必要有一個快速且便利開發的管道,這樣才能擄獲開發人員的心。
MVC4的推出委實是一個震撼彈,在當初Preview時它內容之豐富實在是讓人咋舌,其中最讓大家瘋狂的一項特性就是WebAPI。這個前身為Http服務的傢伙晃著晃著居然加入了MVC中,雖然一開始讓人很不解,但是打開它的程式來看就一豁然開朗了。WebAPI在開發簡直就和Controller開發如出一轍,唯一比較不同的地方在於WebAPI它回傳的東西和Controller不一樣,除此之外,它的開發方式以及Filter的套用嚴然就是一個Controller的變種,雖是如此,但WebAPI還是WebAPI它仍沒有改變它是Http服務的本質。
Http是一種公開的標準,目前在Html5持續媚力燃燒的狀況下Http的應用推陳出新,利如像是影像串流-MotionJPEG以及REST架構…等等。而目前不論手持式裝置或是網頁開發,幾乎都和Http脫離不了關係,為了讓手持式裝置的APP或是網頁的資料總是能夠提供最新資訊,Http就成了最佳的資料獲取管道。或許大家會很好奇,為什麼不是採用目前網路常用的協定,諸如:TCP或是UDP呢?其實,這兩種協定一直都是資料傳輸的老字號,但是並不是所有場合都適用,更甚至在某些場合下是無法使用的,為了避免這種開發上的限制,毫無拘束的Http反倒成了資料傳輸的新寵兒。
在MVC4專案中,App_Start資料夾底下的WebApiConfig.cs檔案,其實裡面幾乎和同資料夾的RouteConfig.cs一樣,其目的都是在做Routing(路由)設定的工作,我們來看看WebApiConfig.cs的程式碼:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
而RouteConfig.cs則為:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
觀其兩者的差異,我們可以從url這個參數中發現。在WebApiConfig中,url的部份是api/{controller}/{id},而RouteConfig則是{controller}/{action}/{id}。而以下範例可以區分誰會被導向WebAPI處理,誰會被導向一般Controller處理。
- http://localhost/Home/ => Controller處理
- http://localhost/api/Customer => WebAPI處理
兩者的差別就在於Url路徑中WebAPI會特別寫上api這三個小寫英文字。
接著我們就來實際新增一個WebAPI看看其中的程式內容。
我們來觀察一下具有空白讀取/謝入動作的API控制器其程式碼內容為何。
public class DefaultController : ApiController { // GET api/default public IEnumerableGet() { return new string[] { "value1", "value2" }; } // GET api/default/5 public string Get(int id) { return "value"; } // POST api/default public void Post([FromBody]string value) { } // PUT api/default/5 public void Put(int id, [FromBody]string value) { } // DELETE api/default/5 public void Delete(int id) { } }
WebAPI遵循REST架構,它利用Http的其中四個動詞(Verb)來對應資料庫操作的新增/刪除/修改/查詢。其對應如下:
- Get => 查詢
- Post => 新增
- Put => 修改
- Delete => 刪除
而DefaultController中的內容,其每個方法的上頭都有一對註解,其註解內容就可以大致窺見WebAPI每個方法其Url大致的輪廓。比較特別的地方就在於Post和Put這兩個方法的參數,其參數中代有屬性標籤: FromBody。這個屬性標籤指的是:該參數是由MessageBody這個類別內容自動取得,也就是說,當Request送過來就會自動從其Body中擷取內容變數value的值出來。
大家應該有個疑問,WebAPI很好用阿而開發模式也和Controller一模一樣,完全省去了WCF煩鎖的組態地獄但卻提供了相同的功用和效果,但是…它和Controller到底是用在什麼場合;什麼場合該用Controller什麼場合該用WebAPI。其實這個問題我曾經想過,後來得到twMVC核心成員-Demo的解答。
總結:WebAPI是一個好用的利器,雖然它被鑲嵌在MVC4中,但是不代表它只能使用MVC4範本來開發,它的本質仍是一種寄宿型服務,它目前僅是寄宿在MVC身上,想當然它也可以自由寄宿在某個Process身上。至此,App_Start這個資料夾的探索已經結束了,再來的章節就是介紹MVC4範本中每個JavaScript的功用即其應用場合。