1

我正在使用 Azure SDK 2012 年 10 月。.NET 的存储客户端库中的 ODataLib 依赖项是通过 ODataLib(版本 5.0.2)解决的。当我对 azure 表发起查询时,出现以下异常:

A supported MIME type could not be found that matches the content type 
    of the response. None of the supported type(s) 'application/atom+xml;type=feed,
    application/atom+xml, application/json;odata=verbose' matches the content type
   'text/xml;charset=utf-8'.

当我使用Fiddler跟踪 HTTP 的标头值时,

对于请求它是

Accept: application/atom+xml,application/xml

对于响应它是

Content-Type: text/xml;charset=utf-8

我确信这是因为我的组织中的代理而发生的。(bcs 相同的代码在没有代理的情况下工作正常)。那么谁能帮我解决这个问题?

1) 有没有办法在触发查询时设置 Content-Type?

2) 还是 ODataLib 不处理 Content-Type: text/xml;charset=utf-8 ?

4

3 回答 3

2

ODataLib 使用 Content-Type 标头来确定应将响应解析为哪种格式。“text/xml”MIME 类型不是每个 OData 的有效内容类型,这就是您收到错误的原因。

如果您有一个将“application/xml”转换为“text/xml”的代理,那么您需要在将它传递给 ODataLib 之前在某个层撤消它。我对 .Net 的存储客户端库没有任何经验,因此我不确定在 ODataLib 解析有效负载之前您对修改响应标头有什么级别的控制,但是如果您可以覆盖响应的 Content-直接键入标题,您可以将“text/xml”改回“application/xml”(或“application/atom+xml”)。

如果您直接使用 ODataLib(或者如果您在其之上使用的库公开了 IODataResponseMessage 实现),您可以修改 IODataResponseMessage.GetHeader() 的实现以在任何尝试返回时返回“application/xml”当方法的输入为“Content-Type”时为“text/xml”。

此外,要回答您的第一个问题,在请求时设置内容类型的方法是通过 Accept 标头,这在您的情况下已经是正确的。

于 2012-12-11T22:02:17.277 回答
1

我们解决了如下问题。

借助Fidler的“ Rules ”菜单下的“Costomize Rules”选项,打开“ CustomRules.js ”文件。存在一个名为“ OnBeforeResponse ”的函数。在此函数中添加以下代码以在将数据提供给应用程序 (API) 之前更改响应 Content-Type。

if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "text/xml")){
    // Remove the content-type header (text/xml)
    oSession.oResponse.headers.Remove("Content-Type");

    // Replace Content-Type with the new type
    oSession.oResponse["Content-Type"] = "application/atom+xml";        

}
于 2012-12-12T09:00:46.723 回答
0

虽然提出的解决方案可能有效,但更简单的解决方案是使用 HTTPS 来避免让代理替换标头。如果您的要求仍是使用 HTTP,则可以修改存储客户端代码以在 OData 库解析之前手动替换此标头(请参阅 HttpResponseAdapterMessage.cs GetHeader 函数)。

于 2012-12-18T17:56:00.317 回答