gSoap EWS "Error Schema Validation"
gSoap EWS "Error Schema Validation"
我对 ews(gSoap) 的 GetServerTimeZones 操作有一些问题。
我的客户端代码是:
//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;
编译成功后,当运行出现肥皂故障错误时:
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>
发送日志为:
<?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>
接收日志为:
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>
我在这里做错了什么?任何帮助表示赞赏。如果您想要更多代码,我也会为您提供。谢谢。
更新:
请求的实际 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: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>
但是在 SENT 日志文件中 ReturnFullTimeZoneData="false"
不存在,所以我不确定,这可能是这个问题的原因吗?
更新(2):
这里是命名空间映射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}
};
谁能告诉我这个 table 是否需要更改?谢谢。
我似乎无法掌握任何版本的 EWS 的架构,但我怀疑 ews:GetServerTimeZonesType
是否具有正确的命名空间前缀。我希望它是 type
,而不是 message
(不管这个区别意味着什么)但是 ews
绑定到 http://schemas.microsoft.com/exchange/services/2006/messages
。
我也不知道你正在使用的库,但似乎没有任何东西可以让你选择控制 xsi:type
注释的添加,它出现了自己做那件事。所以这里对我来说还有一些神秘的事情发生。
在无法访问消息和类型模式的情况下,我的评论只是一个最佳猜测。首先,由于类型模式与消息模式是分开的,我怀疑 ews
是 ns1:id
的 xsi:type
中使用的错误命名空间前缀,应该是 ns1
。其次,可能 xsi:type
出现在那里是因为来自基类型的 inheritance/extension。我的建议是 运行 wsdl2h
和选项 -P
删除不必要的 xsi:type
属性,这些属性源自 xsd:anyType
根类型。如果这没有帮助,那么尝试 运行time 标志 SOAP_XML_NOTYPE
来初始化 soap
上下文,这将删除 all xsi:type
属性。但是 请注意 派生类型的反序列化(需要 xsi:type
将失败 。不过,说真的,xsi:type
是根据到模式对此类型的定义,因此这些定义可能与上游接收者的 XML API.
不匹配
我对 ews(gSoap) 的 GetServerTimeZones 操作有一些问题。
我的客户端代码是:
//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;
编译成功后,当运行出现肥皂故障错误时:
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>
发送日志为:
<?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>
接收日志为:
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>
我在这里做错了什么?任何帮助表示赞赏。如果您想要更多代码,我也会为您提供。谢谢。
更新: 请求的实际 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: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>
但是在 SENT 日志文件中 ReturnFullTimeZoneData="false"
不存在,所以我不确定,这可能是这个问题的原因吗?
更新(2):
这里是命名空间映射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}
};
谁能告诉我这个 table 是否需要更改?谢谢。
我似乎无法掌握任何版本的 EWS 的架构,但我怀疑 ews:GetServerTimeZonesType
是否具有正确的命名空间前缀。我希望它是 type
,而不是 message
(不管这个区别意味着什么)但是 ews
绑定到 http://schemas.microsoft.com/exchange/services/2006/messages
。
我也不知道你正在使用的库,但似乎没有任何东西可以让你选择控制 xsi:type
注释的添加,它出现了自己做那件事。所以这里对我来说还有一些神秘的事情发生。
在无法访问消息和类型模式的情况下,我的评论只是一个最佳猜测。首先,由于类型模式与消息模式是分开的,我怀疑 ews
是 ns1:id
的 xsi:type
中使用的错误命名空间前缀,应该是 ns1
。其次,可能 xsi:type
出现在那里是因为来自基类型的 inheritance/extension。我的建议是 运行 wsdl2h
和选项 -P
删除不必要的 xsi:type
属性,这些属性源自 xsd:anyType
根类型。如果这没有帮助,那么尝试 运行time 标志 SOAP_XML_NOTYPE
来初始化 soap
上下文,这将删除 all xsi:type
属性。但是 请注意 派生类型的反序列化(需要 xsi:type
将失败 。不过,说真的,xsi:type
是根据到模式对此类型的定义,因此这些定义可能与上游接收者的 XML API.