提供RESTful服务
RESTful广泛运用于互联网服务,而在企业应用中,大部分场景仍然是RPC服务,这是由于企业应用的业务复杂性造成的。但是基于SOAP的RPC服务也存在很多的弊端,比如服务异步处理比较麻烦,大部分RPC服务仍然是阻塞性质的,即使在.net 4.5的今天,异步编程已经通过asyn/await极大简化的情况下。其中的原因也挺复杂的,有兴趣了解的可参考以下文章:http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx
简单得将以前的RPC服务进行异步封装是没有必要的。
因此,在适当场合可以考虑提供REST服务,当然REST服务与RPC服务的区别,优劣并不是仅体现在这方面,还有其它诸如跨平台性、可扩展性等方面,因为这两者的协议是完全不一样的,REST毕竟是基于HTTP协议,几乎适用于当前所有平台。
其实microsoft早在.net framework 3.5时期,就已经提供了REST的实现,当时是基于WCF技术,通过对操作增加WebGetAttribute,WebInvokeAttribute来实现GET,POST操作。不过由于其还是基于WCF框架,通过其管道来进行服务调用,还需要配置对应的webHttpBinding,因此个人感觉在.net 3.5时期,REST并未得到广泛应用,当然这也可能是由于我并未从事互联网行业的缘故。
到了.net framework 4时期,microsoft提供了web api这一套框架,用于支持REST服务的开发,最近段时间使用了下,觉得还是挺方便地,对HTTP协议提供了很好的支持,包括可以自定义Request,Response的Header,Content等等,目前我需要的功能,这套框架都能很好地提供支持。并且,服务能够直接通过浏览器,如Chrome,FireDebug等等调试,同时,与WcfTestClient类似,我们也可以用Fiddler之类的调试工具进行很方便的调试。
使用web api框架是很简单的,直接参照ASP.NET的入门文档(http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api),即可很快地搭建起来一个架子,并成功地提供REST服务,在这里我就不重复贴出实现代码了,其关键点如下:
1:通过NuGet获取Microsoft.AspNet.WebApi.SelfHost包,因为我一般使用自宿主模式,很少寄宿在IIS;
2:对需要提供服务的资源(resource)建立对应的controller,在REST中,一切的核心就是resource,围绕resource提供GET,POST,PUT,DELETE等操作,这点与RPC有很大区别,思维模式的转变很大;
3:提供宿主,运行即可,ASP.NET的入门文档中,宿主是Console Application,实际运行环境中,我一般寄宿在Windows service中,其实是非常类似的。
做完以上三部,咱们的REST服务就已经向外提供HTTP服务了。注意这里第3点有个需要注意的小细节,必须以管理员权限运行宿主进程,否则无法监听URL端口。
但正如上文第2点中所说,REST真正的难点,个人感觉并不在技术实现上,其实是一种思维模式的彻底转变,由长久以来RPC服务中业务活动流程为中心的服务设计思想,转变为资源为中心的设计思想,在这样的思维模式下去对我们实际场景中的各种服务进行与以往相比颠覆性的重新设计,才是REST真正的难点所在。
这篇随笔先写写这些,算是个基础入门,架子打起来算是勉强摸了下门槛,之后的工作才是任重道远。
提供RESTful服务的更多相关文章
- 使用CXF开发RESTFul服务
相信大家在阅读CXF官方文档(http://cxf.apache.org/docs/index.html)时,总是一知半解.这里向大家推荐一本PacktPub.Apache.CXF.Web.Servi ...
- Python flask 基于 Flask 提供 RESTful Web 服务
转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...
- Swift是一个提供RESTful HTTP接口的对象存储系统,目的是为了提供一个和AWS S3竞争的服务
Swift是一个提供RESTful HTTP接口的对象存储系统,最初起源于Rackspace的Cloud Files,目的是为了提供一个和AWS S3竞争的服务. Swift于2010年开源,是Ope ...
- 让你的 wowza server提供 RESTful web 服务
有时我们 nginx 须要和 wowza 服务器交互以进行一些 LB 事宜:有时我们的管理员须要实时了解 wowza 服务器的一些其它状态信息(比方一些自己定义对象的状态等等).而用 ...
- java 利用JAX-RS快速开发RESTful 服务
JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从 ...
- atitit.RESTful服务的概览and框架选型
atitit.RESTful服务的概览and框架选型 1. REST基础概念: 1 2. URL说明: 1 3. 1 4. RESTful框架选型 2 1. spring mvc( recomm) ...
- 使用多种客户端消费WCF RestFul服务(四)——Jquery篇
Jquery篇 互联网开发中少不了各类前端开发框架,其中JQUERY就是最流行之一,本篇我们就采用JQUERY来消费WCF RestFul服务,其中用到JSON基础知识,如果有想了解的朋友,请访问:& ...
- 使用 Struts 2 开发 RESTful 服务
REST 简介 REST 是英文 Representational State Transfer 的缩写,这个术语由 Roy Thomas Fielding 博士在他的论文<Architectu ...
- RESTful服务的版本管理经验 (转)
原文:RESTful服务的版本管理经验 最近,Howard Dierking将在设计NuGet API的下一个主要修订版(v3)时新学到的经验,与他在大约一年前的观念做了对比,并写道:使用服务器驱动的 ...
随机推荐
- 强加密RNGCryptoServiceProvider
.net RNGCryptoServiceProvider 对应 java SecureRandom public class SecureRandomextends Random This cla ...
- Jedis下的ShardedJedis(分布式)使用方法(一)
原来项目中有用到Redis用作缓存服务,刚开始时只用一台Redis就能够满足服务,随着项目的慢慢进行,发现一台满足不了现有的项目需求,因为Redis操作都是原子性这样的特性,造成有时同时读写缓存造成查 ...
- java 24 - 3 GUI之添加按钮
需求:把按钮添加到窗体,并对按钮添加一个点击事件. A:创建窗体对象 B:创建按钮对象 C:把按钮添加到窗体 D:窗体显示 注意:这里对按钮添加点击事件,同样使用监听器. 但是,这里的按钮是组件,所以 ...
- 转:GCC,LLVM,Clang编译器对比
GCC,LLVM,Clang编译器对比 转自: http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html 在XCode中, ...
- shipyard安装
1.Start an data volume instance of RethinkDB: # docker run -it -d --name shipyard-rethinkdb-data \ - ...
- memcache分布式 [一致性hash算法] 的php实现
最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是 ...
- selmodel
selmodel不仅可以设置checkbox,还可以设置单元格选中模式,列选择模式,行选择模式
- 039医疗项目-模块四:采购单模块—采购单的创建-----------Dao层,service层,Acion层
我们根据数据库里面的表格:生成对应的Mapper接口文件和...Mapperxml文件: YYCGD:采购单模板表. YYCGD2014:采购单动态生成表,由存储过程生成. YYCGDMX:采购单明细 ...
- Linux Linux程序练习十三(信号阻塞,捕获)
/* * 题目: * 请编写一个程序,设置SIGINT和SIGQUIT信号, * 并在该程序中实现从文件中读取信息的操作, * 并保证在读取文件且只有在读取文件的过程中不会被发送的SIGINT和SIG ...
- [转]C#如何把文件夹压缩打包然后下载
public partial class _Default2 : System.Web.UI.Page{ protected void Page_Load(object sender, EventAr ...