Web API ODataResult始终序列化为Atom

时间:2012-08-18 03:00:56

标签: asp.net-web-api odata

我将从新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支持,因为我不需要它。更好的方法是正确协商内容类型。

2 个答案:

答案 0 :(得分:4)

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

接受=应用/ JSON;的OData =详细

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

答案 1 :(得分:2)

我目前正在尝试使用您链接的Beta套件支持OData。我们应该记住,它是一个测试版软件包,在发布之前可能会发生变化。我遇到了同样的问题。现在,似乎微软计划在Web Api中提供OData v3支持,看看ODataMediaTypeFormatter揭示了这一点。

在OData v3中,将有三种格式:

  • Atom(application/atom+xml
  • JSON详细(application/json;odata=verbose
  • JSON Light(application/json;odata=light

Atom是OData唯一的默认XML格式。 OData v3中的默认JSON格式是JSON light。旧的OData v2 JSON格式已成为OData v3中的JSON Verbose。

Spec(v20120705)第2.2.5.1节支持这一点,其中列出了Accept和相应的响应标头:

  

application / json; odata = verbose - &gt; application/ json; odata = verbose

     

application / json; odata = light - &gt;应用/ JSON;的OData =光

     

application / json - &gt;对于版本1.0和版本2.0响应:application / json; odata = verbose。对于3.0版响应:application / json; odata = light

不幸的是,他们还没有指定JSON指示灯(第2.2.5.1.3节,强调我的):

  

JSON指示灯格式是一种新格式,仅在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"));