Web API中的OData不遵循OData标准规范

时间:2013-06-13 22:49:54

标签: asp.net-mvc asp.net-web-api odata

首先,OData响应的标准规范如下:

{
    "d" : {
        "results": [
            {
                "__metadata": {
                    "uri": "http://demos/Orders(10248)",
                    "type": "SampleModel.Order"
                },
                "ProductId": 10248,
                "Name": "Vgnon"
            }
        ],
        "__count": "1"
    }
}

但是,在Web API(使用EntitySetController)中,OData响应如下所示:

    {
            "odata.metadata":"http://localhost:43111/api/$metadata#Products",
            "odata.count":"1",
            "value":
            [
                {
                  "ProductId":2,
                  "CreatedDate":"2013-06-10T23:53:26",
                  "CreatedBy":0,"Name":"Camera"
                }
            ]
        }

注意两个响应中的计数。 Web API遵循OData标准规范吗?

此外,正如这个SO问题所指出的那样:Web API OData Inlinecount not working 答案如下:

  

开箱即用的$ inlinecount仅在您发回OData响应时有效。

这是否意味着在Web API中(使用EntitySetController或ODataController)我们可以返回OData响应和非OData响应?或者我应该说,标准OData响应和非标准OData响应?

1 个答案:

答案 0 :(得分:8)

WebAPI OData实现遵循OData规范。您在问题顶部包含的JSON是旧的OData JSON格式,现在通常称为“详细JSON”。 WebAPI生成的JSON格式是OData v3及更高版本的新OData JSON格式。 WCF数据服务将为v3服务中的“application / json”媒体类型生成相同的格式。

如果您想要旧格式,请尝试发送“application / json; odata = verbose”的Accept标头。

请查看此处的规范以获取有关新JSON格式的说明:http://docs.oasis-open.org/odata/odata-json-format/v4.0/csprd01/odata-json-format-v4.0-csprd01.html (注意这是OData v4规范,但仍未完成,但大多数关于JSON格式的内容也适用于v3。)