我正在尝试使用新的WebAPI测试版构建一个我可以使用OData query string conventions查询的网络服务,并让它返回OData formatted 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对象?
答案 0 :(得分:5)
您需要编写自己的MediaTypeFormatter
以提供正确的序列化。我们没有在MVC 4 Beta中发布OData格式化程序,但WCF Web Api的先前版本有一些如何编写它的示例。 http://wcf.codeplex.com/SourceControl/list/changesets寻找Microsoft.Net.Http.Formatting.OData(您应该可以使用大部分源代码,但某些实现细节可能已经更改)
另一种方法是尝试构建一个可以序列化为OData v2预期形状的DTO。