.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
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论