数据服务版本管理(WCF 数据服务)

开放式数据协议 (OData) 使您可以创建数据服务,以便客户端可以访问数据,将其作为基于数据模型的使用 URI 的资源。 OData 还支持服务操作的定义。 这些数据服务(及其公开的终结点)在初始部署之后,可能出于多种原因(例如,更改业务需求、信息技术要求,或者为了解决其他问题)而需要更改,并且在其生存期期间可能需要更改多次。 更改现有数据服务时,您必须考虑是否要定义您的数据服务的新版本以及如何最好地将对现有的客户端应用程序的影响降至最低。 本主题提供了有关何时以及如何创建一个新版本的数据服务的指导。 它还描述了 WCF 数据服务 如何处理客户端和数据服务之间的交换,该数据服务支持不同版本的 OData 协议。

WCF 数据服务版本管理

一旦部署数据服务和消耗数据,对数据服务的更改有可能导致与现有的客户端应用程序的兼容性问题。 但是,因为服务的整体业务需求而经常需要进行更改,您必须考虑何时以及如何创建一个新的数据服务版本,以对客户端上的应用程序影响最小。

建议新的数据服务版本的数据模型更改

在考虑是否要发布的数据服务的新版本时,了解不同种类的变化如何影响客户端应用程序很重要。 服务的更改可能会要求您创建一个新版本的数据服务,并可分为以下两个类别:

  • 更改为服务合同 — 其中包括服务操作更新、 实体集 (源) 的可访问性更改、版本的变化和服务行为的更改。

  • 更改数据合同 — 其中包括对数据模型、源的格式,或源自定义的更改。

以下表详述了您应该考虑发布新版本的数据服务的类型更改:

更改类型

需要新的版本

不需要新版本

服务操作

  • 添加新的参数

  • 更改返回类型

  • 删除服务操作

  • 删除现有参数

  • 添加新服务操作

服务行为

  • 禁用计数请求

  • 禁用投影支持

  • 增加所需的数据服务版本

  • 启用计数请求

  • 启用投影支持

  • 降低所需的数据服务版本

实体集权限

  • 限制实体集权限

  • 更改响应代码(第一个新的数字值) 1

  • 放宽实体集权限

  • 更改响应代码(第一个数字值相同)

实体属性

  • 删除现有的属性或关系

  • 添加非可空属性

  • 更改现有属性

  • 添加非可空属性2

实体集

  • 删除实体集

  • 添加派生类型

  • 更改基类型

  • 添加实体集

源自定义

  • 改变实体属性映射

1 这可能取决于客户端应用程序如何严格依赖特定错误代码的接收。

2 可以设置 IgnoreMissingProperties 属性为 true,让客户端忽略数据服务(未在客户端上定义)发送的任何新属性。 但是,当插入时,客户端在 POST 请求中不包括的属性都设置为其默认值。 对于更新,客户端未知属性任何现有数据可能用默认值改写。 在此情况下,应发送更新为 MERGE 要求,其为默认。 有关更多信息,请参见管理数据服务上下文(WCF 数据服务)

如何对数据服务进行版本管理

在需要时,通过创建新服务实例(使用更新的服务合约或数据模型)定义新的数据服务版本。 通过使用新的 URI 终结点(使其与以前的版本不同)公开该新服务。 例如:

  • 旧版本:http://services.odata.org/Northwind/v1/Northwind.svc/

  • 新版本:http://services.odata.org/Northwind/v2/Northwind.svc/

升级数据服务时,客户端将需要也更新(基于新的数据服务的元数据和使用新的根 URI)。 如果可能,您应保持以前版本的数据服务以支持尚未升级以使用新版本的客户端。 在不再需要时,可以删除旧版本的数据服务。 您应该考虑在外部配置文件中维护数据服务终结点的 URI。

OData 协议版本

新版本的 OData 发布后,客户端应用程序可能无法使用数据服务所支持的相同 OData 协议版本。 较旧的客户端应用程序可以访问支持较新版本 OData 的数据服务。 客户端应用程序也可能使用较新版本的 WCF 数据服务 客户端库,其支持较新版本的 OData,比正在访问的数据服务更新。

WCF 数据服务 利用 OData 提供的支持来处理此类版本管理情况。 还支持在客户端使用不同于数据服务所用版本的 OData 时生成和使用数据模型元数据以创建客户端数据服务类。 有关更多信息,请参见 OData:协议版本管理(可能为英文网页)。

版本协商

无论客户端请求的版本如何,都可以将数据服务配置为定义该服务将使用的 OData 协议最高版本。 可以通过为数据服务使用的 DataServiceBehaviorMaxProtocolVersion 属性指定 DataServiceProtocolVersion 值来执行此操作。 有关更多信息,请参见配置数据服务(WCF 数据服务)

当应用程序使用 WCF 数据服务客户端库来访问数据服务时,这些库会根据 OData 的版本以及在您的应用程序中使用的功能自动将这些标头设置为正确值。 默认情况下,WCF 数据服务使用支持请求的操作的最低协议版本。

下表详细说明了包含对特定 OData 协议版本的 WCF 数据服务支持的 .NET Framework 和 Silverlight 版本。

OData 协议版本

支持引入方式

版本 1

  • .NET Framework 版本 3.5 Service Pack 1 (SP1)

  • Silverlight 版本 3

版本 2

  • .NET Framework 版本 4

  • .NET Framework 版本 3.5 SP1 的更新。 可以从 Microsoft 下载中心下载并安装该更新。

  • Silverlight 版本 4

版本 3

元数据版本

默认情况下,WCF 数据服务使用 1.1 版的 CSDL 表示数据模型。 对于基于反射提供程序或自定义数据服务提供程序的数据模型始终如此。 但是,如果数据模型是使用实体框架定义的,则返回的 CSDL 版本就是该实体框架所用的版本。 CSDL 的版本由 Schema 元素的命名空间确定。 有关更多信息,请参见规范 [MC-CSDL]:概念架构定义文件格式(可能为英文网页)。

返回的元数据的 DataServices 元素还包含一个 DataServiceVersion 特性,该特性的值与响应消息中 DataServiceVersion 标头的值相同。 客户端应用程序(如 Visual Studio 中的**“添加服务引用”**对话框)使用此信息生成可以正确使用承载数据服务的 WCF 数据服务版本的客户端数据服务类。 有关更多信息,请参见 OData:协议版本管理(可能为英文网页)。

请参阅

概念

数据服务提供程序 (WCF Data Services)

其他资源

数据服务 (WCF Data Services)