你在使用哪种编程语言?快来投票,亲手选出你心目中的编程语言之王 了解详情
写点什么

使用 WCF 消费 REST 服务

2008 年 5 月 04 日

.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

2008 年 5 月 04 日 03:271513
用户头像

发布了 29 篇内容, 共 26149 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

训练营 - 第三周 - 作业一

行者

【荒于嬉】common pool2 源码阅读纪要

luojiahu

源码阅读 common-pool2

Architecture Phase1 Week3:Design Pattern

phylony-lu

极客大学架构师训练营

架构师训练营第三周学习总结

文智

极客大学架构师训练营

Apache Pulsar 9月月报:正在快速成长的下一代分布式消息流平台

Apache Pulsar

大数据 开源 云原生 Apache Pulsar 消息中间件

当区块链遇见共享经济,会碰撞出怎样的火花?

CECBC区块链专委会

区块链

Week 3 命题作业及总结

阿泰

Week 3 总结

黄立

设计模式

[Python3]三子棋游戏!祝大家中国71周年国庆节快乐!

MengZian

Python

极客大学 - 架构师训练营 第三周

9527

观看《寄生兽 生命的准则》有感

徐说科技

自然 生命 生态

区块链3.0时代:大规模商业应用开发即将实现

CECBC区块链专委会

区块链 数字金融

第三周-代码重构-学习总结

刘希文

架构师训练营 - 作业 - 第三周

Max2012

Architecture Phase1 Week3:HomeWork

phylony-lu

极客大学架构师训练营

架构师训练营 - 第3周课后作业(1 期)

阿甘

好好吃个饭吧,今天想吃什么?你说了算。

叶小鍵

布莱恩·万辛克 减肥、廋身 好好吃饭

架构师训练营-week03-总结

大刘

极客大学架构师训练营

架构师训练营 -week03- 作业

大刘

极客大学架构师训练营

架构师训练营第三周作业

Shunyi

极客大学架构师训练营

组合模式及单例模式

garlic

极客大学架构师训练营

第三周 代码重构学习总结

钟杰

极客大学架构师训练营

区块链可以为物联网做些什么?

CECBC区块链专委会

区块链 物联网

架构一期第三周作业

Airs

架构师训练营 - 第 3 周学习总结(1 期)

阿甘

spring-boot-route(三)实现多文件上传

Java旅途

Java Spring Boot

架构师训练营 Week3 - 课后作业

单例模式 组合模式

第三周作业

华美而火锅

架构师训练营第 1 期 week3

张建亮

极客大学架构师训练营

刘华:公有云不仅是自建机房的替代品

刘华Kenneth

架构 DevOps 敏捷 弹性

Java语言变量的命名规范

倔强的攻城狮

Java

围绕“三个问题”开展的网易云音乐数据基础建设

围绕“三个问题”开展的网易云音乐数据基础建设

使用WCF消费REST服务-InfoQ