我目前还在尝试使用您链接的 Beta 包支持 OData。我们应该记住,它是一个测试包,在发布之前情况可能会发生变化。我遇到了同样的问题。目前,微软似乎正计划在 Web Api 中提供 OData v3 支持,查看 ODataMediaTypeFormatter 即可发现这一点。
在 OData v3 中,将有三种格式:
- 原子 (
application/atom+xml)
- JSON 详细 (
application/json;odata=verbose)
- JSON 灯 (
application/json;odata=light)
Atom 是唯一的默认 XML 格式的 OData。 OData v3 中的默认 JSON 格式是 JSON light。旧的 OData v2 JSON 格式在 OData v3 中变成了 JSON Verbose。
Spec (v20120705) 第 2.2.5.1 节支持此功能,其中列出了接受和相应的响应标头:
application/json;odata=verbose -> application/json;odata=verbose
application/json;odata=light  -> application/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 定义
协议,其中包括元数据信息以及
实例的表示。 JSON 灯的格式
此版本的文档未定义 content-type。
不过,我确实希望 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"));