【问题标题】:Get the OData catalog for Web API OData v4 in XML获取 XML 格式的 Web API OData v4 的 OData 目录
【发布时间】:2014-10-02 08:32:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 目前V4库中$metadata只支持XML格式,查询只支持JSON格式(Content-Type/Accept header or $format=..query param用来判断请求的类型) . OData 版本请求/响应的 HTTP 标头名称已在 V3/V4 之间更改(因此 BreezeJs/DataJS 不起作用)。 Asp.Net/MVC/API/OData 中的 Cors 支持分散,不能很好地协同工作。

标签: .net odata asp.net-web-api-odata odata-v4


【解决方案1】:

很抱歉发布另一个答案,但我的第一个答案太长了。 我找到了这个链接:V4 always returns 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 架构,并且无法正确连接到此端点。

【讨论】:

  • 请注意:在 XML 格式中,您得到的结构与在 JSON 中不同。这是因为不同的模型是序列化的。 XML 版本通过将 EdmModel 写入 EdmSchema(由 OData 委托处理程序完成)来序列化。 Json 版本是 EdmModel 的序列化内容(由 MVC 处理程序完成)。通过混合解析为 (Array[0 to length-1]) 的格式化程序,第一个说它可以编写类型的格式化程序将获胜。对于 XML?/$metadata,它是 OData 格式化程序,对于 JSON?/$metadata,它是 MVC 格式化程序。
【解决方案2】:

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

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

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

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

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。

【讨论】:

  • btw...Visual Studio Lightswitch 使用 OData 作为其服务基础架构,也不会与 v4 对话...
  • 这对目录不起作用(列出哪些实体可用)
  • 无论如何,<url>/$metadata 请求都会作为 V3 的 xml 返回。如果您说它默认为 V4 的 json (json is now the recommended format),那么也许您是对的 - 没有办法强制它返回 xml。但同样,主要问题是响应将包括它的版本,如果像 LinqPad 这样的 V3 客户端看到 V4,那么响应是 json 还是 xml 并不重要......它会完全忽略响应。
  • 刚刚验证了您的声明。无论 Accept 标头是什么 (Accept: application/atom+xml,application/xml;q=0.8),实体列表的响应都会返回:Content-Type: application/json; odata.metadata=minimal; odata.streaming=trueOData-Version: 4.0
猜你喜欢
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 2016-09-13
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多