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

rac*_*cow 9 asp.net odata asp.net-mvc-4 asp.net-web-api

我正在尝试使用新的WebAPI测试版来构建一个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
Run Code Online (Sandbox Code Playgroud)

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

[{"MEPartNumber":"11-2222-3-4444","MFGPartNumber":"123456-123","MFGSerialNumber":"ABC123","RONumber":"987654321","VendorId":"1234567","VendorName":"ACME SERVICE CENTER"}]
Run Code Online (Sandbox Code Playgroud)

我需要符合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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

mar*_*ind 5

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

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