枚举天蓝色的休息呼叫响应时出现Mime-Type异常

时间:2012-12-08 06:53:52

标签: azure odata azure-storage azure-table-storage

我正在使用Azure SDK 2012年10月。通过ODataLib(版本5.0.2)解析了Storage Client Library for .NET中的ODataLib依赖关系。当我在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'.

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

申请是

Accept: application/atom+xml,application/xml

对于响应它是

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

我确信它正在发生,因为我的组织有代理。 (bcs相同的代码适用于没有代理服务器)。 那么有人可以帮我解决这个问题吗?

1)有没有办法在触发查询时设置内容类型?

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

3 个答案:

答案 0 :(得分:2)

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

如果您的代理将“application / xml”转换为“text / xml”,那么在传递给ODataLib之前,您需要在某个层撤消该代理。我对.Net的Storage Client Library没有任何经验,所以我不确定在ODataLib解析有效负载之前对修改响应头的控制程度,但是如果你可以覆盖响应的内容 - 直接输入标题,您只需将“text / xml”更改回“application / xml”(或“application / atom + xml”)。

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

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

答案 1 :(得分:1)

我们解决了以下问题。

Fidler 的“规则”菜单下“Costomize Rules”选项的帮助下,打开“ CustomRules.js < / strong>“文件。存在称为“ 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";        

}

答案 2 :(得分:0)

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