我目前还在使用您链接的 Beta 包试验 OData 支持。我们应该记住,它是一个测试包,在发布之前情况可能会发生变化。我遇到了同样的问题。目前,微软似乎正计划在 Web Api 中提供 OData v3 支持,查看 ODataMediaTypeFormatter 即可发现这一点。
在 OData v3 中,将有三种格式:
- 原子 (
application/atom+xml
)
- JSON 详细 (
application/json;odata=verbose
)
- JSON 灯 (
application/json;odata=light
)
Atom 是 OData 的唯一默认 XML 格式。OData v3 中的默认 JSON 格式是 JSON light。旧的 OData v2 JSON 格式是 OData v3 中的 JSON Verbose。
规范(v20120705)第 2.2.5.1 节支持这一点,其中列出了接受和相应的响应标头:
应用程序/json;odata=verbose -> 应用程序/json;odata=verbose
应用程序/json;odata=light  -> 应用程序/json;odata=light
application/json -> 对于 1.0 版和 2.0 版响应:application/json;odata=verbose。对于 3.0 版响应:application/json;odata=light
不幸的是,他们还没有指定 JSON 灯(第 2.2.5.1.3 节,强调我的):
JSON light 格式是一种新格式,仅在 OData 3.0 协议中定义,通过在表示中不包含元数据信息来优化小尺寸。详细格式表示现有的基于 JSON 的格式,由 OData 1.0、2.0 和 3.0 协议定义,其中包括元数据信息以及实例的表示。此版本的 document 未定义 JSON 轻量级内容类型的格式。
但是,我确实希望 JSON Light 格式将是 JSON Verbose 格式的正确子集。ODataMediaTypeFormatter 的当前实现将仅响应标application/json;odata=verbose
头application/atom+xml
或回退到 ATOM。有趣的是,似乎指定$format=json
返回406。
如果您想要一个临时解决方案,假设轻格式将是详细格式的适当子集,您可以指示 MediaTypeFormatter 响应application/json
请求,从而更容易使用 jQuery 中的 OData,因为我们可以省略指定接受标头:
ODataMediaTypeFormatter odataFormatter = new ODataMediaTypeFormatter(model);
odataFormatter.SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));