网页API ODataResult始终是序列化到凌(Web API ODataResult Is A

2019-09-21 08:15发布

我从新返回一个ODataResult 的Web API的OData包如下:

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支持,因为我并不需要它。 更妙的是有内容类型正确协商。

Answer 1:

你有没有尝试设置接受头,就像这样:

接受=应用/ JSON;的OData =冗长。

这应该返回JSON。 OData协议已经支持JSON一段时间,但在协议应用的V3 / JSON映射到一种叫做JSON光(其尚未实现)。 所以,直到光JSON支持让JSON你必须要更具体一点,并要求自JSON是V1一直的OData的更详细的版本。



Answer 2:

我目前也与OData的支持,使用您链接的β测试包进行实验。 我们应该记住,它是一个测试包和事情都有可能改变,直到释放。 我已经打了同样的问题。 现在,似乎微软正计划提供的OData V3支持网络API,看着ODataMediaTypeFormatter揭示了这一点。

在OData的V3,将有三种形式:

  • 原子( application/atom+xml
  • JSON详细( application/json;odata=verbose
  • JSON光( application/json;odata=light

Atom是OData的唯一,从而默认XML格式。 在V3的OData默认JSON格式是JSON光。 旧的OData V2 JSON格式是什么已经成为JSON放牧中的OData V3。

这是通过所支持的规格 (v20120705)第2.2.5.1其中列出接受并相应响应头:

应用/ JSON;的OData =冗长 - >应用/ JSON;的OData =冗长

应用/ JSON;的OData =光 - >应用/ JSON;的OData =光

应用/ JSON - >有关版本1.0和2.0版响应:应用/ JSON;的OData =冗长。 为版本3.0的响应:应用/ JSON;的OData =光

不幸的是,他们还没有指定JSON尚轻(第2.2.5.1.3,重点煤矿):

的JSON格式光是一种新的格式,只有在的OData 3.0协议的定义,由不包括在所述表示的元数据信息小尺寸优化。 详细格式表示现有的基于JSON格式,由OData的1.0,2.0和3.0协议,包括与一个实例的表示一起元数据信息定义。 用于JSON光内容类型的格式不被此版本的文档定义

然而,我想到的是,JSON格式的光将是JSON详细格式的子集。 当前的实现ODataMediaTypeFormatter的将只响应application/json;odata=verboseapplication/atom+xml标题或回退到ATOM。 有趣的是,似乎指定$format=json返回406 。

如果你想,它假定光格式将详细格式的真子集的临时解决方案,您可以指示MediaTypeFormatter以应对application/json的要求,使其成为一个更容易使用的OData从jQuery的工作,因为我们可以ommit指定在接受头:

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


文章来源: Web API ODataResult Is Always Serializing to Atom