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); }