在最近發布的Visual Studio 2012及.NET 4.5中, 微軟正式推出新的網絡服務框架ASP.NET Web API。作為ASP.NET MVC 4的一部分,ASP.NET Web API這套開源框架的設計目的是簡化RESTful服務的開發和使用。
ASP.NET Web API 與之前的內建HTTP服務解決方案的不同之處在於,它一開始就是圍繞HTTP協議及其消息語義構建起來的。與WCF REST或ASP.NET AJAX加ASMX相比,它不是對現有框架的增強,而是一個全新的平台。新的ASP.NET Web API的優勢在於它匯集了之前各平台的各種最佳特性,結合為一個全面而不臃腫的HTTP平台。
微軟已經有了一個的Web服務框架叫做Windows Communication Foundation( WCF),它利用TCP、HTTP、MSMQ等傳輸協議構建“契約先行”的服務。WCF最初為基於SOAP的服務而設計,首先支持的是WS-*功能,但后來添加了少量迎合REST的功能。在WCF 4.5也有很大的增強,具體可以看如下系列文章:
- What’s new in WCF 4.5? Let’s start with WCF configuration
- What’s new in WCF 4.5? A single WSDL file
- What’s new in WCF 4.5? Configuration tooltips and intellisense in config files
- What’s new in WCF 4.5? Configuration validations
- What’s new in WCF 4.5? Multiple authentication support on a single endpoint in IIS
- What’s new in WCF 4.5? Automatic HTTPS endpoint for IIS
- What’s new in WCF 4.5? BasicHttpsBinding
- What’s new in WCF 4.5? Changed default for ASP.NET compatibility mode
- What’s new in WCF 4.5? Improved streaming in IIS hosting
- What’s new in WCF 4.5? UDP transport support
- What’s new in WCF 4.5? WebSocket support (Part 1 of 2)
- What’s new in WCF 4.5? WebSocket support (Part 2 of 2)
隨着時間流逝,WCF Web API為了讓WCF適配到”原生”HTTP世界,遇到了很多困難。因為WCF主要是為基於SOAP的XML消息設計的,為了讓Web API成為WCF一部分,需要動的手術實在有點大(至少Web API的開發者們給了我這樣的印象),是基於RPC風格的API。另一方面,ASP.NET MVC的基礎設施既能優雅地處理HTTP請求和響應,又能輕松創建各種控制器,好像是創建這種新類型服務的合適途徑。
- 支持URL路由,透過用戶熟悉的MVC風格路由語義,生成干凈的URL
- 根據Accept標頭對請求和響應的序列化形式進行內容協商(Content Negotiation)
- 支持大量輸出格式,包括JSON、XML、ATOM等
- 默認對REST語義有完善支持,同時又不強制限定必須使用REST語義
- 易於擴展的Formatter機制,支持添加新的輸入/輸出類型
- 可通過HttpResponseMessage類、HttpRequestMessage類和強類型枚舉來描述大量的HTTP操作,提供對更高級的HTTP特性的深度支持
- 基於慣例的設計引導用戶按HTTP Services的正確方式行事
- Formatters和Filters延續了MVC的擴展模型,具備出色的擴展能力
- 用於非Web程序時,可以脫離IIS運行(Self-hostable)
- 具備可測試性,測試機制的設計類似於MVC
現在我們擁有了2個服務框架,一個基於RPC機制的WCF和一個基於HTTP的ASP.NET Web Api。在我們的開發實踐中如何進行選擇呢? 可以參照知名互聯網企業,無論是google,facebook,baidu,新浪還是騰訊。他們對外開放的接口都是基於Http的Web API,在服務內部框架都是基於SOA架構設計的,通訊機制都是采用RPC機制的,例如Google Protocol Buffers ,Facebook thift。 我們完全也可以這樣搭配,在內部通訊采用WCF + Protobuf-NET,參看《WCF服務上應用protobuf》,對外的服務采用ASP.NET WEB API。WCF的 TCP、Named Pipes,甚至UDP(在WCF 4.5中)綁定的性能要比HTTP強很多倍,這里有一個幾年前的微軟的測試報告《WCF 性能基准報告》,對外提供的服務采用Web API同時也是一個業界標准問題,用WebAPI就很容易的跨越ios,android,wp等移動終端平台,同時有很成熟的OAuth 解決安全問題。
