OData 1.0/2.0/3.0
根据MS-ODATA 1.7 Versioning and Capability Negotiation:
本文档中定义的 OData 协议支持使用 DataServiceVersion(第 2.2.5.3 节)和 MaxDataServiceVersion(第 2.2.5.7 节)版本请求标头和 DataServiceVersion(第 2.2.5.3 节)响应标头进行有限能力协商。
当它说“有限”时,它的意思是有限:
在从服务器到客户端的响应中,指定了 DataServiceVersion(第 2.2.5.3 节)标头。该值表示服务器在请求中用于生成响应的协议版本,客户端使用该协议版本来确定它是否可以正确解释响应(即,该值不大于关联请求中发送的 MaxDataServiceVersion(第 2.2.5.7 节)标头的值)。标头的值是服务器可用于满足请求的协议的最低版本。
因此,基本上,能够处理 OData 版本 1.0 到 3.0 的一致服务将为 OData 1.0 定义的功能返回“1.0”,为 OData 2.0 定义且在 OData 1.0 中不存在的功能返回“2.0”等。
OData 4.0
根据OData Version 4.0 Part 1: Protocol, Section 8.1.5 Header OData-Version
OData 服务必须在响应中包含 OData-Version 标头以指定用于生成响应的协议版本。客户端必须根据协议指定版本中定义的规则解释响应。
根据What's New in OData Version 4.0, Section 2.1.1 Improved: Protocol Versioning
服务现在以服务器支持的最大协议版本进行响应,并指示客户端可以接受。
另外不包括“降级”到 4.0 之前的版本,建议服务发布者为 4.0 服务使用新的服务根 URL。
因此,对于 OData 的未来版本,从 4.0 开始,我似乎可以可靠地获得我正在寻找的最大版本。
结论
没有明显的方法可以获取 4.0 之前的服务支持的最大 OData 版本。 DataServiceVersion 响应标头将包含可能的最低版本号,具体取决于存在的 URL 功能、服务支持的 OData 版本和客户端请求的版本。
但是,从 OData 4.0 开始,OData-Version 响应标头将始终包含基于服务支持和客户端请求的最大版本。
不幸的是,到目前为止,在我尝试过的每个实例中,将“DataServiceVersion”标头传递给 OData 4.0 服务都会导致 500 内部服务器错误响应(没有 OData-Version 标头)。因此,似乎不能保证同时发送 OData-Version 和 DataServiceVersion 标头。
最好的办法似乎是发送OData-Version,然后寻找DataServiceVersion 响应标头(即使对于支持3.0 的服务也可能是“1.0”)。如果响应中存在该标头,则发送第二个请求,其 DataServiceVersion 标头为“3.0”。如果你get a 4xx response,那就试试“2.0”等