ASP.NET
WCF是.NET平台服務開發的一站式框架,那么為什么還要有ASP.NET Web API呢?簡單來說,ASP.NET Web API的設計和構建只考慮了一件事情,那就是HTTP,而WCF的設計主要是考慮SOAP和WS-*。
WCF已經出現好多年了,相對來說ASP.NET Web API還是個小孩子,但是不意味着ASP.NET Web API要代替WCF,在不同的場合,它們各有長處。ASP.NET Web API非常輕量,在功能和靈活性上都不能和WCF相比。如果你的服務是基於TCP的,或者支持更多的傳輸機制,那么WCF是最好的選擇。然而,不是所有的平台都支持SOAP和WS-*,當客戶端不支持這些協議的時候,ASP.NET Web API就更勝一籌了。
讓我們通過一個例子看一下兩種編程模型的不同:一個根據雇員ID獲取公司雇員的服務。WCF代碼如1-1,ASP.NET Web API代碼如1-2
1-1 WCF方式獲取雇員信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[ServiceContract]
public
interface
IEmployeeService
{
[OperationContract]
[WebGet(UriTemplate =
"/Employees/{id}"
)]
Employee GetEmployee(
string
id);
}
public
class
EmployeeService : IEmployeeService
{
public
Employee GetEmployee(
string
id)
{
return
new
Employee() { Id = id, Name =
"John Q Human"
};
}
}
[DataContract]
public
class
Employee
{
[DataMember]
public
int
Id {
get
;
set
; }
[DataMember]
public
string
Name {
get
;
set
; }
// other members
}
|
1-2 ASP.NET Web API方式獲取雇員信息
1
2
3
4
5
6
7
|
public
class
EmployeeController : ApiController
{
public
Employee Get(
string
id)
{
return
new
Employee() { Id = id, Name =
"John Q Human"
};
}
}
|
這里值得注意的是:ASP.NET Web API和MVC非常像,除了它繼承自ApiController。MVC的一些特性如:綁定和可測試性等對ASP.NET Web API都是可用的。
適合ASP.NET Web API使用的場景:
- 富客戶端web應用程序:ASP.NET Web API適合大量使用AJAX調用的富客戶端應用程序,如Silverlight應用程序,基於Adobe Flash的應用程序或單頁應用程序(SPA)等。
- 本地移動和非移動程序:移動設備不支持SOAP,然而ASP.NET Web API可以作為運行在移動設備上的本地程序的后端。
- 物聯網平台(IOT):使用以太網控制器或GSM貓的IOT設備可以通過HTTP和ASP.NET Web API服務會話。不僅僅是IOT設備,其他支持HTTP的設備,例如RFID讀寫器都可以和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 解決安全問題。