gSoap EWS"错误架构验证"

时间:2015-09-15 18:52:30

标签: c++ xml exchangewebservices gsoap soapfault

我对GetServerTimeZones操作的ews(gSoap)有一些问题。

我的客户代码是:

operator=

编译成功后,当运行它时,我发现了这个肥皂错误错误:

SqMatrix

SENT日志是:

//request
ews__GetServerTimeZonesType *zoneReq = new ews__GetServerTimeZonesType();
zoneReq->Ids = new ns1__NonEmptyArrayOfTimeZoneIdType();
zoneReq->Ids->Id.push_back("Eastern Standard Time");

bool val = false;
zoneReq->ReturnFullTimeZoneData = &val;

//response
__ews__GetServerTimeZonesResponse resp;


if( proxy->GetServerTimeZones(zoneReq, resp) == SOAP_OK)
    std::cout <<  "Works!!" << std::endl;

和RECEIVE日志是:

SOAP 1.1 fault: ns1:ErrorSchemaValidation[no subcode]
"The request failed schema validation: This is an invalid xsi:type 'http://schemas.microsoft.com/exchange/services/2006/messages:GetServerTimeZonesType'." Detail: <e:ResponseCode xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">ErrorSchemaValidation</e:ResponseCode>

我在这里做错了什么?任何帮助赞赏。如果您想要更多代码,我也会为您提供。谢谢。

更新: Request的Actual XML文件是:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ews="http://schemas.microsoft.com/exchange/services/2006/messages">
    <SOAP-ENV:Body>
        <ews:GetServerTimeZones xsi:type="ews:GetServerTimeZonesType">
            <ews:Ids>
                <ns1:Id>Eastern Standard Time</ns1:Id>
            </ews:Ids>
        </ews:GetServerTimeZones>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

但是在SENT日志文件中没有HTTP/1.1 500 Internal Server Error <?xml version="1.0" encoding="utf-8"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <s:Fault> <faultcode xmlns:a="http://schemas.microsoft.com/exchange/services/2006/types">a:ErrorSchemaValidation </faultcode> <faultstring xml:lang="en-US">The request failed schema validation: This is an invalid xsi:type 'http://schemas.microsoft.com/exchange/services/2006/messages:GetServerTimeZonesType'. </faultstring> <detail> <e:ResponseCode xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">ErrorSchemaValidation </e:ResponseCode> <e:Message xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">The request failed schema validation. </e:Message> <t:MessageXml xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> <t:LineNumber>2</t:LineNumber> <t:LinePosition>396</t:LinePosition> <t:Violation>This is an invalid xsi:type 'http://schemas.microsoft.com/exchange/services/2006/messages:GetServerTimeZonesType'.</t:Violation> </t:MessageXml> </detail> </s:Fault> </s:Body> </s:Envelope> ,所以我不确定,这可能是导致此问题的原因吗?

UPDATE(2):

这是名称空间映射表 -

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:ns1="http://schemas.microsoft.com/exchange/services/2006/types"
  xmlns:ews="http://schemas.microsoft.com/exchange/services/2006/messages">
 <SOAP-ENV:Header>
  <ns1:MailboxCulture></ns1:MailboxCulture>
  <ns1:RequestServerVersion Version="Exchange2013_SP1">
  </ns1:RequestServerVersion>
 </SOAP-ENV:Header>
 <SOAP-ENV:Body>
   <ews:GetServerTimeZones ReturnFullTimeZoneData="false">
    <ews:Ids>
     <ns1:Id></ns1:Id>
     <ns1:Id></ns1:Id>
    </ews:Ids>
   </ews:GetServerTimeZones>

 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

有人能告诉我这张表是否需要更改?谢谢。

2 个答案:

答案 0 :(得分:0)

我似乎无法掌握任何版本的EWS的架构,但是我怀疑ews:GetServerTimeZonesType是否具有正确的命名空间前缀。我希望它是type,而不是message(无论区别意味着什么),但ews绑定到http://schemas.microsoft.com/exchange/services/2006/messages

我也不知道您正在使用的图书馆,但似乎没有任何内容可以让您选择控制xsi:type的添加注释似乎就是这样做的。所以在这里发生的事情仍然有些神秘。

答案 1 :(得分:0)

如果无法访问消息并输入模式,我的评论只是最好的猜测。首先,由于类型模式与消息模式是分开的,我怀疑ewsxsi:type ns1:id中使用的错误名称空间前缀,应该是ns1。其次,由于基类型的继承/扩展,可能会出现xsi:type。我的建议是使用选项wsdl2h运行-P,以删除源自xsi:type根类型的不必要的xsd:anyType属性。如果这没有用,那么请尝试运行时标记SOAP_XML_NOTYPE来初始化soap上下文,这将删除所有 xsi:type属性。但是要小心,派生类型的反序列化(需要xsi:type >将失败。但严重的是,xsi:type是根据架构设置的。这种类型的定义,因此可能与这些定义和上游接收者的XML API不匹配。