6

我正在尝试启动并运行 Web API OData V4 端点。

我终于开始了(在从我的端点中删除了所有 DateTime 属性之后),现在实体列表是 JSON 格式的。

我喜欢 JSON,但我使用 LinqPad 来测试我的端点。它不理解我的提要中的实体列表的 JSON。

我已经看过并且似乎找不到将其更改回 XML 的方法,所以我在这里问。

有没有办法让 Web API OData v4 提要的实体列表采用 XML 而不是 JSON?

4

2 回答 2

14

很抱歉发布另一个答案,但我的第一个答案太长了。我找到了这个链接:V4总是返回Json,果然,最后一个建议确实有效:

在 WebAPiConfig 中,将命名空间引用添加到:

using System.Net.Http.Formatting;
using System.Web.OData.Formatter;

然后添加类似:

var formatters = ODataMediaTypeFormatters.Create();
config.Formatters.InsertRange(0, formatters);

实体列表现在以 xml 形式返回。

不利的一面是,现在所有响应都默认为不太受欢迎的冗长 xml/atom。

好处是,该$format请求现在在 v4 中得到尊重。因此,要返回 json,您可以将 url(不弄乱标题)发出为:( http://<myodataurl>?$format=application/json;odata.metadata=full或最小或无)

但是,如前所述,LinqPad 仍然无法识别 v4 架构,并且无法正确连接到此端点。

于 2014-08-12T16:14:29.537 回答
2

如果您使用 MS 演练建议的基本默认配置设置了 Web API 服务,则响应格式化程序已经配置,默认情况下将使用 json 或 xml(如果有提示)。

所以 xml 响应的提示通常来自客户端请求。在其基本形式中,请求将包含一个Accept: application/atom+xml,application/xml标头。如果没有,我相信 Web API 响应将默认为 json。

对于您的特定问题,LinqPad 有另一种选择。当您设置 OData 连接时,对话框有一个FormatterXml 或 Json 选项,它告诉 Linqpad 在其请求中发出相应的 Accept 标头。

使用 Fiddler 监控流量,如果将 LinqPad OData 连接设置为使用 xml 格式化程序,则请求包含标头:

MaxDataServiceVersion: 3.0;NetFx
Accept: application/atom+xml,application/xml

并且响应作为 atom/xml 提要返回。

如果您设置选项以使用 json 格式化程序,则请求包含标头:

MaxDataServiceVersion: 3.0;NetFx
Accept: application/json;odata=minimalmetadata

响应以 json 形式返回。

对于 oData v3,LinqPad 处理得很好。

编辑

这听起来对我不久前运行的一些测试有点熟悉……我不确定 LinqPad 是否支持 v4 协议。它在后台使用 WCF 数据服务客户端,并且这些库在 OData v3 中停止。而且,事实上,正如您从上面的标头中看到的那样,请求只会与 v3 服务对话。

所以你的问题不在于 Web Api 不支持 xml 和 json。问题是 LinqPad 尚未连接到 v4 oData 服务。使用 Fiddler 或其他类似工具,您应该能够从服务请求 json 和/或 xml。

于 2014-08-08T20:41:15.197 回答