示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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);
            }
        }