ReadSoapFault method
Reads the SOAP fault.
The reader.
Implementation
/* private */
Future<SoapFaultDetails?> ReadSoapFault(EwsXmlReader reader) async {
SoapFaultDetails? soapFaultDetails = null;
try {
// WCF may not generate an XML declaration.
await reader.Read();
if (reader.NodeType == XmlNodeType.XmlDeclaration) {
await reader.Read();
}
if (!reader.IsStartElement() ||
(reader.LocalName != XmlElementNames.SOAPEnvelopeElementName)) {
return soapFaultDetails;
}
// Get the namespace URI from the envelope element and use it for the rest of the parsing.
// If it's not 1.1 or 1.2, we can't continue.
XmlNamespace soapNamespace =
EwsUtilities.GetNamespaceFromUri(reader.NamespaceUri);
if (soapNamespace == XmlNamespace.NotSpecified) {
return soapFaultDetails;
}
await reader.Read();
// Skip SOAP header.
if (reader.IsStartElementWithNamespace(
soapNamespace, XmlElementNames.SOAPHeaderElementName)) {
do {
await reader.Read();
} while (!reader.IsEndElementWithNamespace(
soapNamespace, XmlElementNames.SOAPHeaderElementName));
// Queue up the next read
await reader.Read();
}
// Parse the fault element contained within the SOAP body.
if (reader.IsStartElementWithNamespace(
soapNamespace, XmlElementNames.SOAPBodyElementName)) {
do {
await reader.Read();
// Parse Fault element
if (reader.IsStartElementWithNamespace(
soapNamespace, XmlElementNames.SOAPFaultElementName)) {
soapFaultDetails =
await SoapFaultDetails.Parse(reader, soapNamespace);
}
} while (!reader.IsEndElementWithNamespace(
soapNamespace, XmlElementNames.SOAPBodyElementName));
}
await reader.ReadEndElementWithNamespace(
soapNamespace, XmlElementNames.SOAPEnvelopeElementName);
} catch (XmlException) {
// If response doesn't contain a valid SOAP fault, just ignore exception and
// return null for SOAP fault details.
}
return soapFaultDetails;
}