示例#1
0
        static FaultCode ReadFaultCode11(XmlDictionaryReader r)
        {
            FaultCode        subcode = null;
            XmlQualifiedName value   = XmlQualifiedName.Empty;

            if (r.IsEmptyElement)
            {
                throw new ArgumentException("Fault Code is mandatory in SOAP fault message.");
            }

            r.ReadStartElement("faultcode");
            r.MoveToContent();
            while (r.NodeType != XmlNodeType.EndElement)
            {
                if (r.NodeType == XmlNodeType.Element)
                {
                    subcode = ReadFaultCode11(r);
                }
                else
                {
                    value = (XmlQualifiedName)r.ReadContentAs(typeof(XmlQualifiedName), r as IXmlNamespaceResolver);
                }
                r.MoveToContent();
            }
            r.ReadEndElement();

            return(new FaultCode(value.Name, value.Namespace, subcode));
        }
        void IDispatchMessageFormatter.DeserializeRequest(System.ServiceModel.Channels.Message message, object[] parameters)
        {
            int paramCounter = 0;

            XmlDictionaryReader bodyContentReader = message.GetReaderAtBodyContents();

            bodyContentReader.ReadStartElement(XmlRpcProtocol.Params);
            if (parameters.Length > 0)
            {
                while (bodyContentReader.IsStartElement(XmlRpcProtocol.Param) && paramCounter < parameters.Length)
                {
                    bodyContentReader.ReadStartElement();
                    if (bodyContentReader.IsStartElement(XmlRpcProtocol.Value))
                    {
                        bodyContentReader.ReadStartElement();
                        if (bodyContentReader.NodeType == XmlNodeType.Text && !string.IsNullOrEmpty(bodyContentReader.Value.Trim()))
                        {
                            parameters[paramCounter] = bodyContentReader.ReadContentAs(_parameterInfo[paramCounter].ParameterType, null);
                        }
                        else
                        {
                            parameters[paramCounter] = XmlRpcDataContractSerializationHelper.Deserialize(bodyContentReader, _parameterInfo[paramCounter].ParameterType);
                        }
                        bodyContentReader.ReadEndElement();
                    }
                    bodyContentReader.ReadEndElement();
                    bodyContentReader.MoveToContent();
                    paramCounter++;
                }
            }
            bodyContentReader.ReadEndElement();
            bodyContentReader.Close();
        }
        object IClientMessageFormatter.DeserializeReply(System.ServiceModel.Channels.Message message, object[] parameters)
        {
            object returnValue = null;

            XmlDictionaryReader bodyContentReader = message.GetReaderAtBodyContents();

            bodyContentReader.ReadStartElement(XmlRpcProtocol.Params);
            if (bodyContentReader.IsStartElement(XmlRpcProtocol.Param))
            {
                bodyContentReader.ReadStartElement();
                if (bodyContentReader.IsStartElement(XmlRpcProtocol.Value))
                {
                    bodyContentReader.ReadStartElement();
                    if (bodyContentReader.NodeType == XmlNodeType.Text)
                    {
                        returnValue = bodyContentReader.ReadContentAs(_returnParameter.ParameterType, null);
                    }
                    else
                    {
                        returnValue = XmlRpcDataContractSerializationHelper.Deserialize(bodyContentReader, _returnParameter.ParameterType);
                    }
                    bodyContentReader.ReadEndElement();
                }
                bodyContentReader.ReadEndElement();
            }
            bodyContentReader.Close();
            return(returnValue);
        }
        private static void AssertReadContentFromBinary <T>(T expected, XmlBinaryNodeType nodeType, ReadOnlySpan <byte> bytes)
        {
            ReadOnlySpan <byte> documentStart = new byte[] { 0x40, 0x1, 0x61 };  // start node "a"
            MemoryStream        ms            = new MemoryStream(documentStart.Length + 1 + bytes.Length);

            ms.Write(documentStart);
            ms.WriteByte((byte)(nodeType | XmlBinaryNodeType.EndElement)); // With EndElement
            ms.Write(bytes);
            ms.Seek(0, SeekOrigin.Begin);
            XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(ms, XmlDictionaryReaderQuotas.Max);

            reader.ReadStartElement("a");
            T result = (T)reader.ReadContentAs(typeof(T), null);

            reader.ReadEndElement();

            Assert.True(ms.Position == ms.Length, "whole buffer should have been consumed");
            Assert.True(XmlNodeType.None == reader.NodeType, "XmlDictionaryReader should be at end of document");
            Assert.Equal(expected, result);
        }