当前位置: 首页 > news >正文

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即可
有兴趣的朋友可以试试。

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

 

相关文章:

  • jquery特殊符号含意
  • Unix/Linux常用的一些命令--转贴我注明
  • 辅助域控制器删除报错“目标服务器无法分配标识符”
  • .NET Project Open Day(2011.11.13)
  • H3C交换机以太网端口类型
  • 遇事处理方式
  • phpweb解析不当加上传漏洞
  • 读书笔记10:外观模式
  • How Many Times We'll Say Goodbye---歌词
  • myeclipse注册类
  • 爱创课堂每日一题第六十天- 创建ajax的过程
  • 海康流媒体客户端开发
  • “王子”的演讲:N828印象
  • 显示SQL
  • sudo
  • ----------
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Android Volley源码解析
  • Angular 响应式表单之下拉框
  • chrome扩展demo1-小时钟
  • GraphQL学习过程应该是这样的
  • Promise初体验
  • Python利用正则抓取网页内容保存到本地
  • React中的“虫洞”——Context
  • text-decoration与color属性
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 爬虫模拟登陆 SegmentFault
  • 前端_面试
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 一个完整Java Web项目背后的密码
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​你们这样子,耽误我的工作进度怎么办?
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (ZT)薛涌:谈贫说富
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (论文阅读11/100)Fast R-CNN
  • ***监测系统的构建(chkrootkit )
  • ../depcomp: line 571: exec: g++: not found
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net 后台导出excel ,word
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET下的多线程编程—1-线程机制概述
  • ?php echo ?,?php echo Hello world!;?
  • @AutoConfigurationPackage的使用
  • @font-face 用字体画图标
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @我的前任是个极品 微博分析
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算