Asp.net web api Web API ODataResult总是序列化到Atom

Asp.net web api Web API ODataResult总是序列化到Atom,asp.net-web-api,odata,Asp.net Web Api,Odata,我将从new返回一个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).ToArra

我将从new返回一个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);
}
public ODataResult Get(ODataQueryOptions选项)
{
var结果=(options.ApplyTo(_db.Products)为可查询的);
var count=results.count;
var limitedResults=results.Take(100).ToArray();
返回新的ODataResult(结果、null、计数);
}
上述方法非常有效,但无论查询类型如何,它都会返回Atom响应。如何返回JSON


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

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

Accept=application/json;odata=冗长

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

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

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

  • Atom(
    应用程序/Atom+xml
  • JSON详细(
    application/JSON;odata=Verbose
  • JSON灯(
    application/JSON;odata=Light
Atom是OData的唯一默认XML格式。ODataV3中的默认JSON格式是JSON light。旧的ODatav2JSON格式在ODatav3中已经变成了JSON详细格式

(v20120705)第2.2.5.1节支持这一点,该节列出了接受和相应的响应头:

应用程序/json;odata=详细-> 应用程序/json;odata=冗长

应用程序/json;odata=光 -> 应用程序/json;odata=光

application/json->1.0版和2.0版响应:application/json;odata=冗长。对于3.0版响应:application/json;odata=光

不幸的是,他们还没有指定JSON灯(第2.2.5.1.3节,重点):

JSON light格式是一种新格式,仅在OData 3.0中定义 协议,它通过不包含元数据来优化较小的大小 陈述中的信息。详细格式表示 现有的基于JSON的格式,由OData1.0、2.0和3.0定义 协议,该协议包括元数据信息以及 实例的表示JSON灯的格式 此版本的文档未定义内容类型

不过,我确实希望JSON Light格式是JSON详细格式的一个适当子集。ODataMediaTypeFormatter的当前实现将只响应
application/json;odata=verbose
应用程序/atom+xml
标题或回退到atom。有趣的是,指定
$format=json
似乎会返回一个值

如果您想要一个临时解决方案,假设light格式将是详细格式的一个适当子集,那么您可以指示MediaTypeFormatter响应
应用程序/json
请求,使使用jQuery中的OData变得更加容易,因为我们可以指定accept标头:

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

非常感谢。我在这上面花了太长时间。我缺少accept头的odata=verbose部分。你能让它与JSON一起工作吗?我这辈子都不能把上面的东西还给伯爵?它只返回结果,不进行计数。