9

我正在尝试使用新的WebAPI beta 构建一个 Web 服务,我可以使用OData 查询字符串约定进行查询,并让它返回OData 格式的 Json。我还想使用 OData 2.0(而不是 1.0)。

虽然它看起来不支持$select选项并且标头似乎能够覆盖$format选项,但返回一个IQueryable泛型似乎为我需要的大多数其他查询选项提供了支持。

我真正苦苦挣扎的是如何最好地提供符合 OData 2.0 规范的 Json 对象。WebAPI 在查询时只返回正常的 Json 数据。例如,如果我执行类似这样的 GET 请求......

http://localhost:XXXXX/vendor/?$filter=RONUMBER eq '2597385'&$select=VENDORID,VENDORNAME&$top=1&$format=Json

..为了在我的开发机器上获得与指定 RONumber 匹配的最高命中,我收到包含以下 Json 的响应...

[{"MEPartNumber":"11-2222-3-4444","MFGPartNumber":"123456-123","MFGSerialNumber":"ABC123","RONumber":"987654321","VendorId":"1234567","VendorName":"ACME SERVICE CENTER"}]

我需要符合 OData 2.0 规范的 Json。更像这样的东西。。

OData V2: { 
  "d" : { 
    "results":  { 
        "__metadata": {
            "uri": "http://someserver/foo/vendor(1)",
            "type": "Vendor"
        },
        "MEPartNumber": "11-2222-3-4444",
        "MFGPartNumber": "123456-123",
        "MFGSerialNumber": "ABC123", 
        "RONumber":"987654321", 
        "VendorId":"1234567", 
        "VendorName": "ACME SERVICE CENTER"
    }
  }
}

我想我可以编写一个自定义MediaTypeFormatter来获得我想要的结构。我也许还可以修改返回的对象以模仿所需 Json 的结构。除了这两个选项之外,有没有人知道让 WebAPI 给我 OData 2.0 格式的 Json 对象的聪明方法?

4

1 回答 1

5

您需要自己编写MediaTypeFormatter以提供正确的序列化。我们没有在 MVC 4 Beta 中发布 OData 格式化程序,但是 WCF Web Api 的前一个化身有一些如何编写的示例。http://wcf.codeplex.com/SourceControl/list/changesets查找 Microsoft.Net.Http.Formatting.OData(您应该能够使用大部分源代码,尽管一些实现细节可能已经改变)

另一种方法是尝试构建一个 DTO,该 DTO 将序列化为 OData v2 预期的形状。

于 2012-02-22T20:20:25.677 回答