使用 WCF 消费 REST 服务

  • Hartmut Wilms
  • 王锐

2008 年 5 月 4 日

话题:SOA.NETREST语言 & 开发架构

.NET Framework 3.5 引入了 REST 风格的 Windows Communication Foundation(简称 WCF)服务。除了开发和托管 RESTful 服务,还提供了多种选项来消费这些服务。

WCF 通过“web”绑定和允许发布 RESTful 服务的 Web 编程模型提供对 REST 支持。RESTful 服务返回普通的 XML,JSON 编码,或者聚合种子(syndication feed)。网络上有很多关于如何编写这类服务的资源,可是对在.NET Framework 中如何消费 REST 服务却言之甚少。

Simon Evan的文章“使用 Silverlight 2.0 消费服务”中,他指出目前不支持类似 SOAP Web Service 中那样的自动生成代理:

消费其它服务(例如 REST)有一点难度,并且的确使我们惊奇的一件事是,目前还不能自动产生由 ASP.net AJAX(通过 WebHttpBinding)使用的代理。你不得不手动构建一个 URI 字符串,在 HTTP GET 请求(REST)时使用 WebClient 类;对于其他 HTTP 动词,使用 HttpWebRequest 类。如果这个服务使用了 JSON 编码,解析响应可用这两种方法中的任意一种:使用 WCF 的 DataContractJSONSerializer(在概念上与 XmlSerializer 类似),或者使用 LinqToJSON……

Json.NET(LinqToJSON)可以在 Codeplex 网站找到。作为.NET Framework 3.5 组成部分, LINQ to XML可以方便地解析和消费 XML 数据。

Pedram Rezaei解释了如何为“来自Flickr的兴趣列表(ListInteresting)操作”开发一个消费者。起初他采用了 Simon Evan 所说的三步走的方式:

    • 制作 HTTP 请求,并将所有的参数组为 URI 的一部分包含进来
    • 得到 XML 格式的响应
    • 要么解析它,要么把它反序列化成一个对象

即便这是一个可行的方式,但 Pedram 批评说:

我们并没有使用 WCF 提供的统一编程模型,而且 URL 也是通过字符串连接搞出来的。响应也是被手工反序列化成一个对象的。使用 WCF 和 WebHttpBinding 我们可以将绝大部分的工作自动化。

他采用了一种“WCF 方式”,包含如下步骤:

  • 定义一个表示服务提供者的 ServiceContract。

    UriTemplate 包含了所有必要的参数,这些参数与其对应接口方法的参数列表完全一致。这个方法的签名还定义了一个 CLR 返回类型,它从服务响应中反序列化出 XML 内容。这个方法必须被用 WebGet 或者 WebInvoke 属性做注解;而且为了尽可能匹配服务返回的 XML,ServiceContract 必须被配置为使用 XmlSerializerFormat,而不是 DataContractSerializer 格式。
  • 配置客户端端点使用“webHttpBinding”。
  • 为返回值和参数定义 XML serializable 类型。
  • 创建客户端代理,创建方法:要么通过直接实例化 ChannelFactory,要么由 ClientBase 继承。

欲知细节,请阅读 Pedram 的文章Mihailo Lalevic使用了相同的方式来为 eBay API 开发了一个消费者,同时提供了一个 WPF 示例应用(源码)作为他文章的附件。

查看英文原文Consuming REST Services with WCF
SOA.NETREST语言 & 开发架构