REST与SOA架构下WCF的异同比较

日期: 2011-10-27 作者:tyb1222 来源:TechTarget中国 英文

  REST(Representational State Transfer)与SOA(Service-Oriented Architecture)作为当今软件架构中主流的两种架构思想在当前开发过程中已经越来越流行。作为微软.NET平台下的下一代通讯技术,WCF也很好的体现了对他们的支持。那么他们到底有哪些差别又有哪些相同之处呢?本篇将针对这个问题谈谈自己的认识,并通过Demo演示程序。

  本篇设计的内容如下:

  1、REST的特性

  2、SOA的特征

  3、REST与SOA的共同点

  4、REST与SOA的不同点

  5、Demo程序说明

  *REST的特性。

  首先给出一张图:

 *REST的特性。

  它基于HTTP协议,是一种明确构建在客户端/服务端体系结构上的一种风格。特征如下:

  1、网络上的资源都被抽象为资源,这些资源都具有唯一的统一资源标识符

  (URI:Uniform Resource Identiter),这些资源都是自我们描述的。这些资源使用HTTP内容标头类型指定。如:XML、JSON、HTML、PNG等。

  2、服务的使用者通过HTTP协议的标准动作(Get、Put、Post、Delete)通过统一的接口对资源进行操作。

  3、对资源进行的操作不会改变它的URI。

  4、客户端、服务端之间的交互是没有状态的。由于这种无状态行,服务端不需要为每个客户端维护Context

  *SOA的特征

  首先给出一张图:

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

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

tyb1222
tyb1222

相关推荐