예제 #1
0
        public XmlRpcFaultException ParseFault(XmlNode faultNode, ParseStack parseStack)
        {
            var valueNode  = faultNode.SelectSingleNode("value");
            var structNode = valueNode.SelectSingleNode("struct");

            if (structNode == null)
            {
                throw new XmlRpcInvalidXmlRpcException("class element missing from fault response.");
            }

            var fault = new XmlFault();

            try
            {
                fault = (XmlFault)ParseValue(structNode, typeof(XmlFault), parseStack);
            }
            catch (Exception ex)
            {
                // some servers incorrectly return fault code in a string
                if (!_config.AllowStringFaultCode())
                {
                    throw;
                }

                try
                {
                    var faultStrCode = (FaultStructStringCode)ParseValue(structNode, typeof(FaultStructStringCode), parseStack);
                    fault.faultCode   = Convert.ToInt32(faultStrCode.faultCode);
                    fault.faultString = faultStrCode.faultString;
                }
                catch (Exception)
                {
                    // use exception from when attempting to parse code as integer
                    throw ex;
                }
            }

            return(new XmlRpcFaultException(fault.faultCode, fault.faultString));
        }