我从新返回一个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支持,因为我并不需要它。 更妙的是有内容类型正确协商。
你有没有尝试设置接受头,就像这样:
接受=应用/ JSON;的OData =冗长。
这应该返回JSON。 OData协议已经支持JSON一段时间,但在协议应用的V3 / JSON映射到一种叫做JSON光(其尚未实现)。 所以,直到光JSON支持让JSON你必须要更具体一点,并要求自JSON是V1一直的OData的更详细的版本。
我目前也与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=verbose
和application/atom+xml
标题或回退到ATOM。 有趣的是,似乎指定$format=json
返回406 。
如果你想,它假定光格式将详细格式的真子集的临时解决方案,您可以指示MediaTypeFormatter以应对application/json
的要求,使其成为一个更容易使用的OData从jQuery的工作,因为我们可以ommit指定在接受头:
ODataMediaTypeFormatter odataFormatter = new ODataMediaTypeFormatter(model);
odataFormatter.SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));