2012-12-08 45 views
1

2012年10月,我正在使用Azure SDK。.NET存储客户端库中的ODataLib依赖关系通过ODataLib(版本5.0.2)解决。当我火在Azure上表的查询例外,我得到如下:列举Azure休息呼叫响应时出现Mime-Type异常

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'. 

当我用菲德勒跟踪的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?

回答

1

我们解决了如下问题。

随着“Costomize规则”选项下的菲德勒规则” 菜单中的帮助,请打开 “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";   

} 
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头,这在你的情况下已经是正确的了。

+0

感谢您的回复。正如你所说的,我们试图在接收到响应之后并枚举它之前更改头Content-Type字段(使用Fidler的CustomRules选项)。它工作得很好。 –

0

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

joe