在 PDC09 期间,Microsoft WCF 数据服务团队(以前称为 ADO.NET 数据服务团队)首次推出 OData,即开放数据协议。这一消息是在会议第二天的主题演讲中宣布的,但实际上 OData 早就开始了。自从 Microsoft .NET Framework 3.5 SP1 中提供 ADO.NET 数据服务以来,熟悉 ADO.NET 数据服务的用户已经使用 OData 作为数据传输协议开发基于资源的应用程序。本文将介绍富 Internet 应用程序 (RIA) 的开发人员如何使用 OData 以及使用 OData 的优势。
首先,我将回答自 11 月 OData 问世后,我经常被问到的头号问题。是什么问题呢?简单地说,OData 是一种基于资源的 Web 协议,用于查询和更新数据。OData 定义了使用 HTTP 动词(PUT、POST、UPDATE 和 DELETE)对资源的操作,并使用标准的 URI 语法识别这些资源。数据将使用 AtomPub 或 JSON 标准通过 HTTP 进行传输。对于 AtomPub,OData 协议在标准之上定义了一些约定,以支持查询和架构信息的交换。
OData 生态系统
在本文中,我将介绍几个使用或产生 OData 源的产品、框架和 Web 服务。该协议定义了可以操作的资源和方法,以及可以对这些资源执行的操作(GET、PUT、POST、MERGE 和 DELETE,分别对应着读取、创建、替换、合并和删除)。
实际上,这表示任何可以使用 OData 协议的客户端都可以对任何生产者进行操作,没必要学习服务的编程模型即可针对该服务进行编程,只要选择编程的目标语言即可。
例如,如果您是 Silverlight 开发人员,学习适用于该平台的 OData 库,则您可以针对任何 OData 源进行编程。除了适用于 Silverlight 的 OData 库,您还会发现适用于 Microsoft .NET Framework 客户端、AJAX、Java、PHP 和 Objective-C 的库,更多的库还在不断推出。此外,Microsoft PowerPivot for Excel 也支持将 OData 源作为将数据导入到其内存中分析引擎的选项。
就像能使用 OData 协议的客户端可以对任何生产者进行操作一样,使用 OData 创建的服务或应用程序可以被任何启用了 OData 的客户端使用。在创建用于将关系数据公开为 OData 端点(或在 SharePoint 站点、Windows Azure 的表或其他您使用的服务中公开数据)的 Web 服务之后,您可以很轻松地在 .NET Framework 中构建富桌面客户端,或构建使用相同数据的富 AJAX 网站。
OData 的长期目标是为每种主流技术、编程语言和平台都打造一个 OData 客户端库,以便每个客户端应用程序都可以使用丰富的 OData 源。OData 的生产者和使用者共同构成了 OData“生态系统”。
WCF 数据服务的新功能
作为 .NET Framework 组件的 WCF 数据服务是一个可提供交钥匙解决方案的框架,用于创建 OData Web 服务。它包括一个客户端库,您可以用来构建使用 OData 源的客户端。WCF 数据服务团队最近发布了 .NET Framework 3.5 SP1 的更新,引入了一系列将在 .NET Framework 4 中推出的新功能。这是数据服务框架的第二个版本。请访问 blogs.msdn.com/astoriateam/archive/2010/01/27/data-services-update-for-net-3-5-sp1-available-for-download.aspx,在这里可以找到相关介绍和下载链接。
WCF 数据服务框架不仅仅是针对 RIA 应用程序的协议,而且还适用于高级服务开发人员。它有很多吸引人的功能,例如服务器分页限制、HTTP 缓存支持、无状态服务、流支持和可插入的提供程序模型。让我们来看看吸引大多数 RIA 开发人员的新功能。
初始版本推出之后,用户最期望的功能之一就是能够请求集中的实体数量。新的“计数”功能从两方面满足了该需求。首先,它让您只请求计数,即一条查询可以返回的值的数量。其次,它添加了一个查询选项,告诉服务当查询结果是部分集时(例如启用了服务器分页),包括集中实体总数的计数。
为了改善从 OData 服务绑定数据时的使用体验,一种新的类型 DataServiceCollection 已添加到 WCF 数据服务客户端库中。该类型实现对其包含的条目的变更跟踪(通过使用 INotifyPropertyChanged 和 INotifyCollectionChanged 接口)。如果将其绑定到控件(例如 Silverlight 中的 DataGrid),它将跟踪对象和集合本身的更改。这个新的集合大大简化了使用接口组件创建 OData 客户端的过程。