c++xmlexchangewebservicesgsoapsoapfault

gSoap EWS "Error Schema Validation"


I have some problems with ews(gSoap) for GetServerTimeZones operation.

my client code is:

//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;

After successful compilation, when Run it i've this soap fault error:

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>

SENT log is:

<?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>

and RECEIVE log is:

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>

What am i doing wrong here? Any help appreciated. If you want more code i'll provide you that also. Thank you.

UPDATE: The Actual XML file for Request is:

<?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>

But in SENT log file there ReturnFullTimeZoneData="false" is absent, so i'm not sure about it, could it be a reason of this problem?

UPDATE(2):

Here is the namespace mapping table-

#include "soapH.h"
SOAP_NMAC struct Namespace namespaces[] =
{
    {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL},
    {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL},
    {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL},
    {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL},
    {"ns1", "http://schemas.microsoft.com/exchange/services/2006/types", NULL, NULL},
    {"ews", "http://schemas.microsoft.com/exchange/services/2006/messages", NULL, NULL},
    {NULL, NULL, NULL, NULL}
};

Could anyone tell me is there need to be change in this table or not? thank you.


Solution

  • Without access to the message and type schemas my comment is just a best guess. First, since the type schema is separate from the message schema, I suspect that ews is the wrong namespace prefix used in the xsi:type of ns1:id and should be ns1. Second, perhaps the xsi:type occurs there because of inheritance/extension from a base type. My suggestion is to run wsdl2h with option -P to remove unnecessary xsi:type attributes that originate from deriving from the xsd:anyType root type. If that does not help then try the runtime flag SOAP_XML_NOTYPE to initialize the soap context which will remove all xsi:type attributes. But beware that deserialization of derived types (that require xsi:type will fail. Seriously though, the xsi:type is set according to the schema's definition of this type, so there might be a mismatch with these definitions and the upstream receiver's XML API.