4

我正在从新的Web API OData 包返回 ODataResult,如下所示:

public ODataResult<Product> Get(ODataQueryOptions options)
{
  var results = (options.ApplyTo(_db.Products) as IQueryable<Product>);
  var count  = results.Count;
  var limitedResults = results.Take(100).ToArray();
  return new ODataResult<Product>(results,null,count);
}

上面的效果很好,但无论查询类型如何,它总是返回一个 Atom 响应。如何返回 JSON?

我可以看到 Atom 是 ODataMediaTypeFormatter 集合中第一个受支持的媒体类型。我很高兴完全删除 Atom 支持,因为我不需要它。更好的是正确协商内容类型。

4

2 回答 2

4

您是否尝试过设置接受标头,如下所示:

接受=应用程序/json;odata=详细。

那应该返回 JSON。OData 协议已经支持 JSON 有一段时间了,但在协议的 V3 中,application/json 被映射到称为 JSON light 的东西(尚未实现)。因此,在支持 JSON light 以获取 JSON 之前,您必须更加具体一些,并请求自 V1 以来一直在 OData 中的更详细的 JSON 版本。

于 2012-08-18T07:48:52.940 回答
2

我目前还在使用您链接的 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=verboseapplication/atom+xml或回退到 ATOM。有趣的是,似乎指定$format=json返回406

如果您想要一个临时解决方案,假设轻格式将是详细格式的适当子集,您可以指示 MediaTypeFormatter 响应application/json请求,从而更容易使用 jQuery 中的 OData,因为我们可以省略指定接受标头:

ODataMediaTypeFormatter odataFormatter = new ODataMediaTypeFormatter(model);    
odataFormatter.SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));
于 2012-09-11T13:46:04.257 回答