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服务的调用代码如下:

 1 using (ChannelFactory<ILog> factory = new ChannelFactory<ILog>("SOAService"))
2 {
3 ILog log = factory.CreateChannel();
4 List<LogEntity> listAll = log.GetAll();
5 Console.WriteLine(string.Format("GetAll 方法获取到日志记录有{0}条", listAll.Count));
6 Console.WriteLine();
7 const string year = "2011";
8 const string month = "10";
9 List<LogEntity> list = log.GetMonthLog(year, month);
10 Console.WriteLine(string.Format("GetMonthLog 方法获取到{0}年{1}月日志记录有{2}条",year,month,list.Count));
11 }




对REST的调用代码如下:

 1 HttpWebRequest request = WebRequest.Create("http://localhost:27790/RESTService.svc/") as HttpWebRequest;
2 request.Method = "GET";
3 HttpWebResponse response = request.GetResponse() as HttpWebResponse;
4 using (StreamReader reader=new StreamReader(response.GetResponseStream()))
5 {
6 if (response.StatusCode==HttpStatusCode.OK)
7 {
8 Console.WriteLine(reader.ReadToEnd());
9 }
10 }



  

如下图所示:


在REST中调用 GetMonthLog方法,只需将URI 换成http://localhost:27790/RESTService.svc/Get/2011/10即可
有兴趣的朋友可以试试。

后记:本篇中所述为个人认识,如有偏颇,还望指教,谢谢!

 

posted @ 2011-10-27 17:19  tyb1222  阅读(5325)  评论(10编辑  收藏  举报