/// <summary> /// Deserializes X-Road message response or throws <see>XRoadFaultException</see> when /// X-Road fault is parsed from the message instead of expected result value. /// </summary> public static object DeserializeMessageContent(this XRoadMessage message, IServiceMap serviceMap) { if (serviceMap.ResponseValueDefinition.ContainsNonTechnicalFault) { ThrowIfXRoadFault(message, serviceMap); } message.ContentStream.Position = 0; using (var reader = XmlReader.Create(message.ContentStream)) { reader.MoveToBody(); if (!reader.MoveToElement(2)) { throw XRoadException.InvalidQuery("No payload element in SOAP message."); } if (reader.NamespaceURI == NamespaceConstants.SOAP_ENV && reader.LocalName == "Fault") { throw new SoapFaultException(SoapMessageHelper.DeserializeSoapFault(reader)); } var result = serviceMap.DeserializeResponse(reader, message); var fault = result as XRoadFault; if (fault != null) { throw new XRoadFaultException(fault); } return(result); } }
/// <summary> /// Deserializes X-Road message response or throws <see>XRoadFaultException</see> when /// X-Road fault is parsed from the message instead of expected result value. /// </summary> public static object DeserializeMessageContent(this XRoadMessage message, IServiceMap serviceMap, IMessageFormatter messageFormatter) { if (serviceMap.ResponseDefinition.ContainsNonTechnicalFault) { ThrowIfXRoadFault(message, serviceMap, messageFormatter); } message.ContentStream.Position = 0; using (var reader = XmlReader.Create(message.ContentStream)) { messageFormatter.MoveToBody(reader); if (!reader.MoveToElement(2)) { throw new InvalidQueryException("No payload element in SOAP message."); } messageFormatter.ThrowSoapFaultIfPresent(reader); var result = serviceMap.DeserializeResponse(reader, message); return(result is XRoadFault fault ? throw new XRoadFaultException(fault) : result); } }