[.NET] 如何選擇實作 HTTP 服務的技術?

在雲端服務風行之後,HTTP service 己經成為各大網路服務供應商的選擇,因此各大服務幾乎都用 HTTP service 來實作自己的網路APIs,也讓 HTTP APIs 有如雪球般快速的擴大,現在己經遠遠的超過了Windows API的函式數量。據programmableweb.com的統計,現在全球共有6,700多個HTTP API可用,而且還在快速的成長中...

在雲端服務風行之後,HTTP service 己經成為各大網路服務供應商的選擇,因此各大服務幾乎都用 HTTP service 來實作自己的網路APIs,也讓 HTTP APIs 有如雪球般快速的擴大,現在己經遠遠的超過了Windows API的函式數量。據programmableweb.com的統計,現在全球共有6,700多個HTTP API可用,而且還在快速的成長中。

所以,身為開發Web Application與雲端服務的Web Developer來說,隨時都有需要開發HTTP API的工作,而以微軟技術圈來看,可用來做HTTP API的技術就一大堆,其中有幾個重要的實作方式:

  • HTTP Handler
  • ASP.NET Web Form
  • ASP.NET MVC
  • ASP.NET MVC Web API
  • WCF

本文不會涉及到Web Service的開發,因為基本上Web Service和HTTP API是對立的,Web Service十分適合中大型企業進行高程度安全需求的資料交換與傳輸,它使用的是由WS-I協會所制訂的SOAP通訊協定以及XML為基礎的資料結構,並遵從許多不同的WS-I規範來開發網路服務,所以Web Service在適當的架構下是十分安全而且能處理多種資料結構交換的技術。

不過既然它們這麼好,為什麼會被HTTP API打趴呢?就因為一個字:

SOAP+XML的技術能描述相當多的資料傳輸內容,然而它們都需要一堆文字,有寫過XML的人就清楚,XML 所需的文字內容相當的多,再加上SOAP協定本身以及它所裝載的文字訊息內容,以及原本的HTTP傳輸所需要的標頭資訊,等於一次要傳個幾十KB以上的訊息長度,雖然適合企業級應用程式 (它們通常不會在意頻寬),但對於小型的應用程式或是Internet應用程式而言,XML和SOAP光是要建置通訊協定訊息就很麻煩了 (雖然有工具可以減少這部份的負擔),而且愈來愈多應用程式是要實作成 mashup 或大量運用 JavaScript 開發,XML 的解析對瀏覽器來說確實有點重,反而另一個技術 JSON (JavaScript Object Notation) 卻因 JavaScript 最佳化而廣為被許多網路廠商作為資料交換的主要媒介,JSON 的可壓縮 (minification) 以及具結構的資料格式,讓它在短短一兩年內成為開發HTTP服務的主要交換協定,而一些主流的開發平台也因為JSON的流行而開發可產生它的資料類別,如Json.NET。HTTP API憑藉它的,快速取代了現有的Web Service作為主流的開發方式。

說遠了,回到正題吧,上面所提的五個主要技術,各有擅場,但要怎麼選擇呢?讓我們繼續看下去...

1. ASP.NET Web Form

Web Form相信是所有ASP.NET開發人員都熟悉的平台,它具有自己的事件處理流程,幫開發人員做掉了太多的事情,用來快速開發Web Application是相當適合的,但是若是要用來開發HTTP API,則嫌太重了,而且它需要流過完整的 ASP.NET 事件流,在即時回應這一點上會吃很大的虧。

2. HTTP Handler

HTTP Handler 是ASP.NET Web Form技術中具有高度可客制化能力的物件,就回應速度而言,絕對勝於Web Form,但它天生沒有客制化URL的能力,而HTTP API又非常重視REST這個特性,再加上它只是作為一個HTTP端點,其他的物件導向特性必須要由開發人員自己實作,因此它並不適用於快速開發HTTP API,但微軟應用了它開發了不同的HTTP API平台,ASP.NET MVC 就是一種。

3. ASP.NET MVC

MVC 技術近兩年來己經成為微軟的Web技術的顯學,它具有客制化介面以及將核心層組裝化 (透過IoC) 的能力以取得高擴充性,Model 也能支援多數的資料與服務來源,Controller 將Model和View整合,再加上可高度客制化的View,讓MVC成為開發中大型Web Application的首選,開發人員能應用ActionResult傳回各種不同的資料,而使用ASP.NET Routing為URL客制化,基本上都符合了開發HTTP API的要件。

不過MVC在View上,若要客制回傳的訊息,必須要實作ActionResult抽象類別,對於一些以物件為主的Web服務而言還不夠方便,這也是為什麼會有Web API技術的出現。

4. ASP.NET MVC Web API

Web API是改良MVC現有View技術而來的,除了允許開發人員使用物件的方式控制資料外,它也允許開發人員針對HTTP通訊的訊息做客制,讓它變得更適合HTTP API的開發,而它內含的 OData 支援,也讓它成為幾乎欽定的HTTP API開發的平台。

5. WCF Web API

WCF (Windows Communication Foundation) 是微軟開發己久的核心通訊平台,它適用於客制度極高的通訊開發需求,就連通訊的格式都可以自訂,而且透過 Contract 的方式來定義兩端的通訊格式與方法,它也具有極高的彈性。

極高的客制能力和彈性同時造就了複雜的configuration infrastructure,想要利用WCF開發應用程式的開發人員很少不會碰到configuration infrastructure,而它的高複雜度也讓WCF變得很不親民,當然這是拿高彈性和高客制程度所付出的代價,因此WCF所開發的服務能適用於各種不同的平台,Web平台也是其一,如果說應用程式本來就有應用到WCF,而且需要開放HTTP API時,使用WCF開發是不錯的選擇,但要開發新的HTTP API,則最好考慮使用ASP.NET MVC或ASP.NET MVC Web API 來開發比較好。