我正在使用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?
答案 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函数)。
乔