REST與SOA兩種架構(gòu)下WCF的異同比較(含源碼)
REST(Representational State Transfer)與SOA(Service-Oriented Architecture)作為當(dāng)今軟件架構(gòu)中主流的兩種架構(gòu)思想在當(dāng)前開發(fā)過程中已經(jīng)越來越流行。作為微軟.NET平臺(tái)下的下一代通訊技術(shù),WCF也很好的體現(xiàn)了對(duì)他們的支持。那么他們到底有哪些差別又有哪些相同之處呢。?本篇將針對(duì)這個(gè)問題談?wù)勛约旱恼J(rèn)識(shí),并通過Demo演示程序。
本篇設(shè)計(jì)的內(nèi)容如下:
1、REST的特性
2、SOA的特征
3、REST與SOA的共同點(diǎn)
4、REST與SOA的不同點(diǎn)
5、Demo程序說明
*REST的特性。
首先給出一張圖:

它基于HTTP協(xié)議,是一種明確構(gòu)建在客戶端/服務(wù)端體系結(jié)構(gòu)上的一種風(fēng)格。特征如下:
1、網(wǎng)絡(luò)上的資源都被抽象為資源,這些資源都具有唯一的統(tǒng)一資源標(biāo)識(shí)符
(URI:Uniform Resource Identiter),這些資源都是自我們描述的。這些資源使用HTTP內(nèi)容標(biāo)頭類型指定。如:XML、JSON、HTML、PNG等。
2、服務(wù)的使用者通過HTTP協(xié)議的標(biāo)準(zhǔn)動(dòng)作(Get、Put、Post、Delete)通過統(tǒng)一的接口對(duì)資源進(jìn)行操作。
3、對(duì)資源進(jìn)行的操作不會(huì)改變它的URI。
4、客戶端、服務(wù)端之間的交互是沒有狀態(tài)的。由于這種無狀態(tài)行,服務(wù)端不需要為每個(gè)客戶端維護(hù)Context
*SOA的特征
首先給出一張圖:

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

客戶端對(duì)SOA服務(wù)的調(diào)用代碼如下:
- 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));
- }
對(duì)REST的調(diào)用代碼如下:
- 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中調(diào)用 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
【編輯推薦】