4

我正在从 wcf 数据服务迁移到 asp.net web api odata,并且在使用相对 URL 时遇到问题。我正在尝试实现本文中描述的功能(添加实体之间的关系):

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4

我不知道这是否是由于 odata 协议 v4 的协议规范造成的,但是使用相对 URL 绝对可以使用 odata v3 和 wcf 数据服务。

问题是,如果您在反向代理后面,那么绝对 url 不起作用。如果您在请求中指定相对 URL

PUT http://myproductservice.example.com/Products(6)/Supplier/$ref HTTP/1.1
OData-Version: 4.0;NetFx
OData-MaxVersion: 4.0;NetFx
Accept: application/json;odata.metadata=minimal
Accept-Charset: UTF-8
Content-Type: application/json;odata.metadata=minimal
User-Agent: Microsoft ADO.NET Data Services
Host: myproductservice.example.com
Content-Length: 70
Expect: 100-continue

{"@odata.id":"Suppliers(4)"}

你会得到一个例外,明确指出相对 url 只允许与 odata 上下文结合使用——所以无论哪种方式,你都必须知道绝对 URL。是否有解决方案可以解决此问题并使用相对 URL?至少:这如何与负载平衡器、反向代理等结合使用?

更新

如我所见,即使没有 odata 上下文,也应该可以使用相对 URL(形成 odata v4 规范http://docs.oasis-open.org/odata/odata-json-format/v4.0/cs01/odata-json-format -v4.0-cs01.html#_Toc365464682):

有效载荷(无论是请求还是响应)中的 URL 可以表示为相对 URL。

如果上下文 URL 存在于与相对 URL 或封闭对象相同的 JSON 对象中,则相对 URL 相对于下一个上下文 URL。此规则也适用于上下文 URL;它们可以相对于封闭对象的上下文 URL。

如果请求中不存在上下文 URL,则相对 URL 是相对于请求 URL 的。

如果响应中不存在上下文 URL,则相对 URL 是相对于响应的 Content-Location 标头的。

在没有 Content-Location 标头或上下文 URL 的响应中,相对 URL 是相对于请求 URL 的。

扩展 URL 的处理器必须使用 [RFC3986] 中定义的正常 URL 扩展规则。这意味着如果基本 URL 是上下文 URL,则在解析相对 URL 时会忽略以 $metadata# 开头的部分。


有没有其他人从 wcf 数据服务迁移到 web api odata 并且知道一些好的资源来阅读?AFAIK 承诺要开源 WCF 数据服务,那发生了什么?

4

0 回答 0