Asp.Net MVC4 Web API - 从查询返回OData格式化的Json,无需自定义MediaTypeFormatter

时间:2012-02-22 05:53:56

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

我正在尝试使用新的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对象?

1 个答案:

答案 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。