REST與SOA兩種架構下WCF的異同比較(含源碼)
REST(Representational State Transfer)與SOA(Service-Oriented Architecture)作為當今軟件架構中主流的兩種架構思想在當前開發過程中已經越來越流行。作為微軟.NET平臺下的下一代通訊技術,WCF也很好的體現了對他們的支持。那么他們到底有哪些差別又有哪些相同之處呢。?本篇將針對這個問題談談自己的認識,并通過Demo演示程序。
本篇設計的內容如下:
1、REST的特性
2、SOA的特征
3、REST與SOA的共同點
4、REST與SOA的不同點
5、Demo程序說明
*REST的特性。
首先給出一張圖:

它基于HTTP協議,是一種明確構建在客戶端/服務端體系結構上的一種風格。特征如下:
1、網絡上的資源都被抽象為資源,這些資源都具有唯一的統一資源標識符
(URI:Uniform Resource Identiter),這些資源都是自我們描述的。這些資源使用HTTP內容標頭類型指定。如:XML、JSON、HTML、PNG等。
2、服務的使用者通過HTTP協議的標準動作(Get、Put、Post、Delete)通過統一的接口對資源進行操作。
3、對資源進行的操作不會改變它的URI。
4、客戶端、服務端之間的交互是沒有狀態的。由于這種無狀態行,服務端不需要為每個客戶端維護Context
*SOA的特征
首先給出一張圖:

1、通過網絡終結點對外提供服務。
2、粗粒度的服務接口。
*REST與SOA的共同點
REST與SOA兩者,雖有不同點,但是他們都作為服務的不同架構風格,具有服務的一般屬性。具體如下:
1、統一的服務契約接口與服務接口
2、松散的耦合。
3、只要有權限都可以進行訪問
*REST與SOA的不同點
1、REST風格下的,只有一種協議,那就是HTTP。而SOA下的WCF就和多種協議了。如:TCP、HTTP、MSMQ等多種協議
2、使用方式上的不同。REST只要客戶端能夠模擬HTTP請求,通過標準的HTTP動作,都可以進行訪問。它使用的是HTTPChannel管道,而SOA下的WCF由于
協議的多樣性,使用的管道有HTTPChannel、TcpChannel、RPC等多種。
3、REST寄宿時,雖然可以選擇多種寄宿方式,但必須有IIS的支持(稍后章節會介紹它的寄宿方式)。SOA下的WCF卻沒有這個限制
*Demo程序
程序沿用了上節使用的實例,分別實現了REST與SOA服務。服務中,契約的定義以及實現完全相同。為了使用用REST相同的協議,SOA服務端采用了wsHttpBinding協議。REST與SOA服務的消費者采用同一個客戶端。
程序結構如下圖:

客戶端對SOA服務的調用代碼如下:
- using (ChannelFactory<ILog> factory = new ChannelFactory<ILog>("SOAService"))
- {
- ILog log = factory.CreateChannel();
- List<LogEntity> listAll = log.GetAll();
- Console.WriteLine(string.Format("GetAll 方法獲取到日志記錄有{0}條", listAll.Count));
- Console.WriteLine();
- const string year = "2011";
- const string month = "10";
- List<LogEntity> list = log.GetMonthLog(year, month);
- Console.WriteLine(string.Format("GetMonthLog 方法獲取到{0}年{1}月日志記錄有{2}條",year,month,list.Count));
- }
對REST的調用代碼如下:
- HttpWebRequest request = WebRequest.Create("http://localhost:27790/RESTService.svc/") as HttpWebRequest;
- request.Method = "GET";
- HttpWebResponse response = request.GetResponse() as HttpWebResponse;
- using (StreamReader reader=new StreamReader(response.GetResponseStream()))
- {
- if (response.StatusCode==HttpStatusCode.OK)
- {
- Console.WriteLine(reader.ReadToEnd());
- }
- }
如下圖所示:

在REST中調用 GetMonthLog方法,只需將URI 換成http://localhost:27790/RESTService.svc/Get/2011/10即可
有興趣的朋友可以試試。
源碼下載:http://files.cnblogs.com/tyb1222/WCFStyle.rar
原文:http://www.cnblogs.com/tyb1222/archive/2011/10/27/2226845.html
【編輯推薦】