【问题标题】:Web API ODataResult Is Always Serializing to AtomWeb API ODataResult 总是序列化为 Atom
【发布时间】:2012-08-14 11:22:00
【问题描述】:

我正在从新的Web API OData package 返回一个 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 支持,因为我不需要它。更好的是正确协商内容类型。

【问题讨论】:

  • 您能否让它与 JSON 一起使用?我不能为我的生活得到上面的回报吗?它只返回结果,没有计数。

标签: asp.net-web-api odata


【解决方案1】:

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

Accept=application/json;odata=verbose.

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

【讨论】:

  • 谢谢!我在这上面花了太长时间。我错过了接受标头的 odata=verbose 部分。
【解决方案2】:

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

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

ODataMediaTypeFormatter odataFormatter = new ODataMediaTypeFormatter(model);    
odataFormatter.SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多