_cuclife.com
当前位置:cuclife.com > IT > ASP.NET >

OData 的实际应用:通过开放数据协议构建富 Internet 应用程序

在 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 客户端的过程。

  另一项用户期待的功能是投影查询结果返回的实体的属性子集。为此已经添加了 LINQ 支持,这种支持通过 LINQ Select 语句实现。这有两方面的好处:可以减小 HTTP 查询响应的大小,还可以减小客户端方对象的内存占用量。当您针对别人的服务开发客户端应用程序,而且该服务中每个实体都有很多对客户端无意义的属性时,这就特别有用。我将在后文中演示如何使用有很多实体、每个实体又有无数属性的大型公共服务。示例中的投影非常有用,因为它只包括一个实体上的少数几个必需的属性。

  为了帮助您了解 OData 生态系统的价值,我们将创建一个 Web 应用程序,让访问者浏览一家虚拟的房地产公司 Contoso Ltd. 的网站,查看其管理的房产销售清单。

  关系数据

  Contoso.com 的 Home Finder 应用程序的主要数据源是一个 SQL Server 数据库,其中包含该公司管理的所有房产的信息,以及为这些房产发布的所有销售清单(在售的和已售出的)。

  借助 .NET Framework 3.5 SP1 中提供的 WCF 数据服务和 ADO.NET 实体框架,很容易将关系数据库作为 OData 源提供,所需的只是在关系数据上创建实体框架模型。OData 源是基于 HTTP 的,因此您需要一个网站或 Web 服务来托管该服务。

  若要在关系数据上创建 OData 源,第一步是在 Visual Studio 2010 中创建 ASP.NET Web 应用程序以托管 OData 服务。在 Visual Studio 中,选择“文件”|“新建”|“项目”|“ASP.NET Web 应用程序”。这将创建用来托管 OData 源的 Web 服务的框架。

  创建并配置 Web 服务后,我们接着创建 OData 源将提供的实体框架数据模型。Visual Studio 提供了“添加新项”向导,帮助您从现有的数据库自动生成模型,从而让操作变得很容易。图 1 显示了使用“添加新项”向导根据 SQL Server 数据(包含 Contoso 管理的房产和销售清单)创建的简单数据模型。


图 3 SharePoint 站点的服务文档

  OData URI 约定

  服务文档列出了服务提供的实体集。请记住,您可以使用强大的 URI 语法(是 OData 协议的可选部分)来访问此服务中的资源。让我们快速了解一下此服务的 URI 语法。若要访问每个实体集的源,您需要将实体集的名称附加到服务的基本 URI 中,例如 将指向 Properties 实体集中的一组实体。

  还可以使用单个实体的键值来指向该实体,例如 URI Listings.svc/Properties(0) 将指向 ID = 0 的房产。您可以将关系名称附加到 URI 末尾,以指向此实体与其他实体或实体集的关系,因此 Listings.svc/Properties(0)/Listings 将指向与 ID = 0 的房产实体相关的一组销售清单。使用此语法,可以浏览关系的很多层级。

  URI 还定义了很多可以附加到 URI 的查询选项,以便在一定程度上修改基本查询,其中每个查询选项都定义为名称/值对。例如,附加查询选项 $top=10 后,就将查询限制为仅包含结果中的前 10 个实体。图 4 列出了 URI 语法中所有可用的查询选项。

  图 4 OData 查询选项

$top=n 将查询限制为前 n 个实体。

$skip=n 跳过集中的前 n 个实体。

$inlinecount=allpages 在结果中包含集中所有实体的计数。

$filter=<表达式> 可以用表达式限制查询返回的结果(例如:$filter=Status eq 'Available' 将结果限制为具有 Status 属性且此属性值为 Available 的实体)。

$orderby=<表达式> 按照实体的一组属性对结果进行排序

$select=<表达式> 指定要返回的实体的属性子集。

$format 指定要返回的源的格式(ATOM 或 JSON)。此选项在 WCF 数据服务中不受支持。

  从 SharePoint 提供数据

  在前述部分中,我为您展示了如何提供关系数据库中存储的数据,以及房地产网站的房产和销售清单信息。让我们假设我还有负责出售房产的代理人信息,但这些数据存储在 SharePoint 站点中。Microsoft SharePoint 2010 提供了相应功能,可以将所有列表和列表中的文档作为 OData 源提供。这非常适合该房地产网站,因为这意味着该公司员工输入的代理人信息可作为 OData 源使用,可以包含在我构建的销售清单应用程序中。使用 SharePoint 接口负责输入和更新此数据的用户不必更改其工作流程来适应我的应用程序。输入到公司 SharePoint 站点的数据在即将创建的 Listings 应用程序中实时可用。

  图 5 显示了简单的 SharePoint 门户,房地产代理人可用来记录和更新其联系信息。


图 13 OGDI 示例服务的 Open Data Visualizer 视图

文章来源:网络整理  本站编辑:兰特
上一篇:三种中文分词算法优劣比较
下一篇:如何用JS获取ASP.net中的textbox的值 js获不到text值
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)