我正在尝试启动并运行 Web API OData V4 端点。
我终于开始了(在从我的端点中删除了所有 DateTime 属性之后),现在实体列表是 JSON 格式的。
我喜欢 JSON,但我使用 LinqPad 来测试我的端点。它不理解我的提要中的实体列表的 JSON。
我已经看过并且似乎找不到将其更改回 XML 的方法,所以我在这里问。
有没有办法让 Web API OData v4 提要的实体列表采用 XML 而不是 JSON?
我正在尝试启动并运行 Web API OData V4 端点。
我终于开始了(在从我的端点中删除了所有 DateTime 属性之后),现在实体列表是 JSON 格式的。
我喜欢 JSON,但我使用 LinqPad 来测试我的端点。它不理解我的提要中的实体列表的 JSON。
我已经看过并且似乎找不到将其更改回 XML 的方法,所以我在这里问。
有没有办法让 Web API OData v4 提要的实体列表采用 XML 而不是 JSON?
很抱歉发布另一个答案,但我的第一个答案太长了。我找到了这个链接: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 架构,并且无法正确连接到此端点。
如果您使用 MS 演练建议的基本默认配置设置了 Web API 服务,则响应格式化程序已经配置,默认情况下将使用 json 或 xml(如果有提示)。
所以 xml 响应的提示通常来自客户端请求。在其基本形式中,请求将包含一个Accept: application/atom+xml,application/xml
标头。如果没有,我相信 Web API 响应将默认为 json。
对于您的特定问题,LinqPad 有另一种选择。当您设置 OData 连接时,对话框有一个Formatter
Xml 或 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。