Exemple #1
0
        void DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, object[] parameters)
        {
            if (parts.Length != parameters.Length)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                          new ArgumentException(SR.Format(SR.SFxParameterCountMismatch, "parts", parts.Length, "parameters", parameters.Length), nameof(parameters)));
            }

            int nextPartIndex = 0;

            while (reader.IsStartElement())
            {
                for (int i = nextPartIndex; i < parts.Length; i++)
                {
                    PartInfo part = parts[i];
                    if (IsPartElement(reader, part))
                    {
                        parameters[part.Description.Index] = DeserializeParameter(reader, parts[i]);
                        nextPartIndex = i + 1;
                    }
                    else
                    {
                        parameters[part.Description.Index] = null;
                    }
                }

                if (reader.IsStartElement())
                {
                    OperationFormatter.TraceAndSkipElement(reader);
                }
            }
        }
Exemple #2
0
        object DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, bool isRequest)
        {
            object val;

            try
            {
                val = part.ReadObject(reader);
            }
            catch (System.InvalidOperationException e)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(
                                                                              SR.Format(SR.SFxInvalidMessageBodyErrorDeserializingParameter, part.Description.Namespace, part.Description.Name), e));
            }
            catch (System.Runtime.Serialization.InvalidDataContractException e)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(
                                                                              SR.Format(SR.SFxInvalidMessageBodyErrorDeserializingParameter, part.Description.Namespace, part.Description.Name), e));
            }
            catch (System.FormatException e)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                          OperationFormatter.CreateDeserializationFailedFault(
                              SR.Format(SR.SFxInvalidMessageBodyErrorDeserializingParameterMore, part.Description.Namespace, part.Description.Name, e.Message),
                              e));
            }
            catch (System.Runtime.Serialization.SerializationException e)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                          OperationFormatter.CreateDeserializationFailedFault(
                              SR.Format(SR.SFxInvalidMessageBodyErrorDeserializingParameterMore, part.Description.Namespace, part.Description.Name, e.Message),
                              e));
            }

            return(val);
        }
 protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
 {
     lock (ThisLock)
     {
         OperationFormatter.SerializeBodyContents(writer, _version, _parameters, _returnValue, _isRequest);
     }
 }
Exemple #4
0
        void DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, object[] parameters, bool isRequest)
        {
            int nextPartIndex = 0;

            while (reader.IsStartElement())
            {
                for (int i = nextPartIndex; i < parts.Length; i++)
                {
                    PartInfo part = parts[i];
                    if (part.Serializer.IsStartObject(reader))
                    {
                        object parameterValue = DeserializeParameter(reader, part, isRequest);
                        parameters[part.Description.Index] = parameterValue;
                        nextPartIndex = i + 1;
                    }
                    else
                    {
                        parameters[part.Description.Index] = null;
                    }
                }

                if (reader.IsStartElement())
                {
                    OperationFormatter.TraceAndSkipElement(reader);
                }
            }
        }
Exemple #5
0
        public void DeserializeRequest(Message message, object[] parameters)
        {
            if (message == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(message));
            }

            if (parameters == null)
            {
                throw TraceUtility.ThrowHelperError(new ArgumentNullException(nameof(parameters)), message);
            }

            try
            {
                if (requestDescription.IsTypedMessage)
                {
                    object            typeMessageInstance = CreateTypedMessageInstance(requestDescription.MessageType);
                    TypedMessageParts typedMessageParts   = new TypedMessageParts(typeMessageInstance, requestDescription);
                    object[]          parts = new object[typedMessageParts.Count];

                    GetPropertiesFromMessage(message, requestDescription, parts);
                    GetHeadersFromMessage(message, requestDescription, parts, true /*isRequest*/);
                    DeserializeBodyContents(message, parts, true /*isRequest*/);

                    // copy values into the actual field/properties
                    typedMessageParts.SetTypedMessageParts(parts);

                    parameters[0] = typeMessageInstance;
                }
                else
                {
                    GetPropertiesFromMessage(message, requestDescription, parameters);
                    GetHeadersFromMessage(message, requestDescription, parameters, true /*isRequest*/);
                    DeserializeBodyContents(message, parameters, true /*isRequest*/);
                }
            }
            catch (XmlException xe)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                          OperationFormatter.CreateDeserializationFailedFault(
                              SR.Format(SR.SFxErrorDeserializingRequestBodyMore, operationName, xe.Message),
                              xe));
            }
            catch (FormatException fe)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                          OperationFormatter.CreateDeserializationFailedFault(
                              SR.Format(SR.SFxErrorDeserializingRequestBodyMore, operationName, fe.Message),
                              fe));
            }
            catch (SerializationException se)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new CommunicationException(
                                                                              SR.Format(SR.SFxErrorDeserializingRequestBodyMore, operationName, se.Message),
                                                                              se));
            }
        }
Exemple #6
0
 public OperationFormatterBodyWriter(OperationFormatter operationFormatter, MessageVersion version,
                                     object[] parameters, object returnValue, bool isRequest)
     : base(AreParametersBuffered(isRequest, operationFormatter))
 {
     this.parameters         = parameters;
     this.returnValue        = returnValue;
     this.isRequest          = isRequest;
     this.operationFormatter = operationFormatter;
     this.version            = version;
 }
Exemple #7
0
        public PrimitiveOperationFormatter(OperationDescription description, bool isRpc)
        {
            if (description == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("description");
            }

            OperationFormatter.Validate(description, isRpc, false /*isEncoded*/);

            operation      = description;
            requestMessage = description.Messages[0];
            if (description.Messages.Count == 2)
            {
                responseMessage = description.Messages[1];
            }

            int stringCount = 3 + requestMessage.Body.Parts.Count;

            if (responseMessage != null)
            {
                stringCount += 2 + responseMessage.Body.Parts.Count;
            }

            XmlDictionary dictionary = new XmlDictionary(stringCount * 2);

            xsiNilLocalName = dictionary.Add("nil");
            xsiNilNamespace = dictionary.Add(NsXsi);

            OperationFormatter.GetActions(description, dictionary, out action, out replyAction);

            if (requestMessage.Body.WrapperName != null)
            {
                requestWrapperName      = AddToDictionary(dictionary, requestMessage.Body.WrapperName);
                requestWrapperNamespace = AddToDictionary(dictionary, requestMessage.Body.WrapperNamespace);
            }

            requestParts = AddToDictionary(dictionary, requestMessage.Body.Parts, isRpc);

            if (responseMessage != null)
            {
                if (responseMessage.Body.WrapperName != null)
                {
                    responseWrapperName      = AddToDictionary(dictionary, responseMessage.Body.WrapperName);
                    responseWrapperNamespace = AddToDictionary(dictionary, responseMessage.Body.WrapperNamespace);
                }

                responseParts = AddToDictionary(dictionary, responseMessage.Body.Parts, isRpc);

                if (responseMessage.Body.ReturnValue != null && responseMessage.Body.ReturnValue.Type != typeof(void))
                {
                    returnPart = AddToDictionary(dictionary, responseMessage.Body.ReturnValue, isRpc);
                }
            }
        }
            private readonly MessageHeader _innerHeader; //use innerHeader to handle versionSupported, actor/role handling etc.

            public OperationFormatterHeader(OperationFormatter operationFormatter, MessageVersion version, string name, string ns, bool mustUnderstand, string actor, bool relay)
            {
                if (actor != null)
                {
                    _innerHeader = CreateHeader(name, ns, null /*headerValue*/, mustUnderstand, actor, relay);
                }
                else
                {
                    _innerHeader = CreateHeader(name, ns, null /*headerValue*/, mustUnderstand, "", relay);
                }
            }
        public void DeserializeRequest(Message message, object[] parameters)
        {
            if (message == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException(nameof(message)));
            }

            if (parameters == null)
            {
                throw TraceUtility.ThrowHelperError(new ArgumentNullException(nameof(parameters)), message);
            }

            try
            {
                if (message.IsEmpty)
                {
                    if (_requestWrapperName == null)
                    {
                        return;
                    }

                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(SR.SFxInvalidMessageBodyEmptyMessage));
                }

                XmlDictionaryReader bodyReader = message.GetReaderAtBodyContents();
                using (bodyReader)
                {
                    DeserializeRequest(bodyReader, parameters);
                    message.ReadFromBodyContentsToEnd(bodyReader);
                }
            }
            catch (XmlException xe)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                    OperationFormatter.CreateDeserializationFailedFault(
                        SR.Format(SR.SFxErrorDeserializingRequestBodyMore, _operation.Name, xe.Message),
                        xe));
            }
            catch (FormatException fe)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                    OperationFormatter.CreateDeserializationFailedFault(
                        SR.Format(SR.SFxErrorDeserializingRequestBodyMore, _operation.Name, fe.Message),
                        fe));
            }
            catch (SerializationException se)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new CommunicationException(
                    SR.Format(SR.SFxErrorDeserializingRequestBodyMore, _operation.Name, se.Message),
                    se));
            }
        }
        private object DeserializeResponse(XmlDictionaryReader reader, object[] parameters)
        {
            if (_responseWrapperName != null)
            {
                if (!reader.IsStartElement(_responseWrapperName, _responseWrapperNamespace))
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(SR.Format(SR.SFxInvalidMessageBody, _responseWrapperName, _responseWrapperNamespace, reader.NodeType, reader.Name, reader.NamespaceURI)));
                }

                bool isEmptyElement = reader.IsEmptyElement;
                reader.Read();
                if (isEmptyElement)
                {
                    return(null);
                }
            }

            object returnValue = null;

            if (_returnPart != null)
            {
                while (true)
                {
                    if (IsPartElement(reader, _returnPart))
                    {
                        returnValue = DeserializeParameter(reader, _returnPart);
                        break;
                    }
                    if (!reader.IsStartElement())
                    {
                        break;
                    }

                    if (IsPartElements(reader, _responseParts))
                    {
                        break;
                    }

                    OperationFormatter.TraceAndSkipElement(reader);
                }
            }
            DeserializeParameters(reader, _responseParts, parameters);

            if (_responseWrapperName != null)
            {
                reader.ReadEndElement();
            }

            return(returnValue);
        }
Exemple #11
0
 private static MessagePartDescription GetStreamPart(MessageDescription messageDescription)
 {
     if (OperationFormatter.IsValidReturnValue(messageDescription.Body.ReturnValue))
     {
         if (messageDescription.Body.Parts.Count == 0)
         {
             if (messageDescription.Body.ReturnValue.Type == typeof(Stream))
             {
                 return(messageDescription.Body.ReturnValue);
             }
         }
     }
     else
     {
         if (messageDescription.Body.Parts.Count == 1)
         {
             if (messageDescription.Body.Parts[0].Type == typeof(Stream))
             {
                 return(messageDescription.Body.Parts[0]);
             }
         }
     }
     return(null);
 }
 protected override Task OnWriteBodyContentsAsync(XmlDictionaryWriter writer)
 {
     return(OperationFormatter.SerializeBodyContentsAsync(writer, _version, _parameters, _returnValue, _isRequest));
 }
Exemple #13
0
        protected override object DeserializeBody(XmlDictionaryReader reader, MessageVersion version, string action, MessageDescription messageDescription, object[] parameters, bool isRequest)
        {
            if (reader == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("reader"));
            }
            if (parameters == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("parameters"));
            }

            MessageInfo messageInfo;

            if (isRequest)
            {
                messageInfo = requestMessageInfo;
            }
            else
            {
                messageInfo = replyMessageInfo;
            }

            if (messageInfo.WrapperName != null)
            {
                if (!reader.IsStartElement(messageInfo.WrapperName, messageInfo.WrapperNamespace))
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SerializationException(SR.Format(SR.SFxInvalidMessageBody, messageInfo.WrapperName, messageInfo.WrapperNamespace, reader.NodeType, reader.Name, reader.NamespaceURI)));
                }
                bool isEmptyElement = reader.IsEmptyElement;
                reader.Read();
                if (isEmptyElement)
                {
                    return(null);
                }
            }
            object returnValue = null;

            if (messageInfo.ReturnPart != null)
            {
                while (true)
                {
                    PartInfo part = messageInfo.ReturnPart;
                    if (part.Serializer.IsStartObject(reader))
                    {
                        returnValue = DeserializeParameter(reader, part, isRequest);
                        break;
                    }
                    if (!reader.IsStartElement())
                    {
                        break;
                    }
                    OperationFormatter.TraceAndSkipElement(reader);
                }
            }
            DeserializeParameters(reader, messageInfo.BodyParts, parameters, isRequest);
            if (messageInfo.WrapperName != null)
            {
                reader.ReadEndElement();
            }
            return(returnValue);
        }
Exemple #14
0
 public XmlElementMessageHeader(OperationFormatter operationFormatter, MessageVersion version, string name, string ns, bool mustUnderstand, string actor, bool relay, XmlElement headerValue) :
     base(operationFormatter, version, name, ns, mustUnderstand, actor, relay)
 {
     this.headerValue = headerValue;
 }
Exemple #15
0
                static bool AreParametersBuffered(bool isRequest, OperationFormatter operationFormatter)
                {
                    StreamFormatter streamFormatter = isRequest ? operationFormatter.requestStreamFormatter : operationFormatter.replyStreamFormatter;

                    return(streamFormatter == null);
                }
Exemple #16
0
 public OperationFormatterMessage(OperationFormatter operationFormatter, MessageVersion version, ActionHeader action,
                                  object[] parameters, object returnValue, bool isRequest)
     : base(version, action, new OperationFormatterBodyWriter(operationFormatter, version, parameters, returnValue, isRequest))
 {
     this.operationFormatter = operationFormatter;
 }
Exemple #17
0
 OperationFormatterMessage(MessageHeaders headers, KeyValuePair <string, object>[] properties, OperationFormatterBodyWriter bodyWriter)
     : base(headers, properties, bodyWriter)
 {
     operationFormatter = bodyWriter.OperationFormatter;
 }