InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

用WCF创建一个REST的API

作者 Hartmut Wilms 译者 张逸 发布于 2008年3月18日

领域
架构 & 设计,
企业架构,
语言 & 开发
主题
.NET ,
SOA ,
.NET框架 ,
REST
标签
Web服务 ,
WCF

Aaron Sloman和Haider Sabri在MIX08中谈到了如何“使用WCF创建一个REST的API”,其中,介绍了一个名为RESTChess的REST应用程序示例。

Aaron Sloman首先谈到在WCF中支持REST的某些背景信息。接着,Haider Sabri则对REST以及REST的主要特性进行了简要的介绍。据Haider所说,REST提供的关键优势在于:

    • 低的学习门槛
    • ROA遵循了Web语义……适于Web服务的APIs
    • 灵活多变的响应格式

他认为“如果客户端未知,那么在创建一个通用API时,REST是最佳选择”。

WCF通过Web编程模型来支持REST,该模型是在.NET Framework 3.5中增加的,包括如下概念:

  • URI Templates & WebGet/WebInvoke
    • 它们都是特性,用于映射HTTP请求到类中的方法。
  • WebHttpBinding
    • WebHttpBinding是WCF的一个绑定,允许WCF基于WebHttp进行内容发送。
    • 你可以很容易地在REST和SOAP的API之间进行切换。
  • WebOperationContext
    • WebOperationContext支持以REST方式处理请求与响应。

Haider Sabri介绍了RESTChess,它是用于国际象棋游戏的REST的API。RESTChess既是一个很好的例子,用来展现采用WCF的Web编程模型实现的REST的API,同时又是一个扩展集(定制WCF绑定和行为),弥补了WCF Web编程模型的缺陷:

  • 灵活的URIs
    • 在IIS托管服务时,服务的.svc扩展名是必备的。
    • RESTChess提供了一个URL的重写器,并在IIS 7中被实现为一个HTTP模块。
  • 为只支持GET和POST的低级REST客户端搭建支撑的桥梁
    • 有两种常见的方法可以解决这一问题:
      • 自定义HTTP标头
      • _method查询参数
    • RESTChess实现了一个自定义WCF通道,可以分辨高级的和低级的REST客户端,以及修改利用隐藏的DELETE或PUT方法通过POST请求传递到适合的HTTP方法的消息。
  • 使用数据签名验证请求
    • RESTChess使用了OAuth,它是一个包含了数据签名的“支持安全的API验证的开放协议”。
    • OAuth调用者作为查询参数对签名进行传递。
    • 一个自定义的WCF通道负责检查请求是否具有OAuth密钥,如果在请求被分发给服务模型之前,调用者没有被验证(密钥不存在或者不能识别),就会抛出一个异常。
  • 多种表现形式
    • WCF只支持XML和JSON。
  • REST的异常处理
    • RESTChess团队构建了一个引擎,能够将异常映射到适当的HTTP错误代码。

虽然该团队为WCF的Web编程模型完成了拾遗补阙的任务,但Haider则认为:“WCF的闪光之处就在于能够对它进行扩展、添加,以及构建在高水平的基础之上”。

查看英文原文:Creating a RESTful API with WCF

译者 张逸 是一个怀揣梦想的架构师,沉迷于设计之美,著译作包括《软件设计精要与模式》、《WCF服务编程》等。

深度内容

专访Jeffery Richter:Windows 8是微软的重中之重

Jeffery Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffery Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。

解析JDK 7的动态类型语言支持

随着JDK 7的发布,字节码指令集终于迎来了第一位新成员——invokedynamic指令。这条新增加的指令是JDK 7实现“动态类型语言(Dynamically Typed Language)”支持而进行的改进之一,也是为JDK 8可以顺利实现Lambda表达式做技术准备。在这篇文章中,我们将去了解JDK 7这项新特性的出现前因后果和它的意义。