XmlSerializer GetSerializer(MessageBodyDescription desc)
        {
            if (bodySerializers.ContainsKey(desc))
            {
                return(bodySerializers [desc]);
            }

            int count = desc.Parts.Count + (HasReturnValue(desc) ? 1 : 0);

            XmlReflectionMember [] members = new XmlReflectionMember [count];

            int ind = 0;

            if (HasReturnValue(desc))
            {
                members [ind++] = CreateReflectionMember(desc.ReturnValue, true);
            }

            foreach (MessagePartDescription partDesc in desc.Parts)
            {
                members [ind++] = CreateReflectionMember(partDesc, false);
            }

            XmlReflectionImporter xmlImporter = new XmlReflectionImporter();

            // Register known types into xmlImporter.
            foreach (var type in OperationKnownTypes)
            {
                xmlImporter.IncludeType(type);
            }
            XmlMembersMapping [] partsMapping = new XmlMembersMapping [1];
            partsMapping [0]       = xmlImporter.ImportMembersMapping(desc.WrapperName, desc.WrapperNamespace, members, true);
            bodySerializers [desc] = XmlSerializer.FromMappings(partsMapping) [0];
            return(bodySerializers [desc]);
        }
        public void MessagesNameSpace()
        {
            ContractDescription cd =
                ContractDescription.GetContract(typeof(IFoo2));
            OperationDescription od = cd.Operations [0];

            Assert.IsNull(od.Messages.Find("Echo"), "#1");
            MessageDescription md = od.Messages.Find("http://MonoTests.System.ServiceModel.Description/IFoo2/Echo");

            Assert.IsNotNull(md, "#2");

            Assert.AreEqual("http://MonoTests.System.ServiceModel.Description/IFoo2/Echo", md.Action, "#3");
            Assert.AreEqual(MessageDirection.Input, md.Direction, "#4");
            Assert.IsFalse(md.HasProtectionLevel, "#5");
            Assert.IsNotNull(md.Headers, "#6");
            Assert.AreEqual(0, md.Headers.Count, "#7");
            Assert.IsNull(md.MessageType, "#8");
            Assert.IsNotNull(md.Properties, "#9");
            Assert.AreEqual(0, md.Properties.Count, "#10");

            MessageBodyDescription mb = md.Body;

            Assert.IsNotNull(mb, "#11");
            Assert.AreEqual("Echo", mb.WrapperName, "#12");
            Assert.AreEqual("http://MonoTests.System.ServiceModel.Description", mb.WrapperNamespace, "#13");
            Assert.IsNotNull(mb.Parts, "#14");
            Assert.AreEqual(0, mb.Parts.Count, "#15");
            Assert.IsNull(mb.ReturnValue, "#16");              // void Echo()
        }
Exemple #3
0
 public DataContractBodyWriter(MessageBodyDescription desc, DataContractMessagesFormatter parent, object [] parts)
     : base(false)
 {
     this.desc   = desc;
     this.parent = parent;
     this.parts  = parts;
 }
 protected static object [] CreatePartsArray(MessageBodyDescription desc)
 {
     if (HasReturnValue(desc))
     {
         return(new object [desc.Parts.Count + 1]);
     }
     return(new object [desc.Parts.Count]);
 }
Exemple #5
0
        public void GetContractIRequestChannel()
        {
            ContractDescription cd = ContractDescription.GetContract(typeof(IRequestChannel));

            Assert.AreEqual(typeof(IRequestChannel), cd.ContractType, "#_1");
            Assert.AreEqual("IRequestChannel", cd.Name, "#_2");
            Assert.AreEqual("http://schemas.microsoft.com/2005/07/ServiceModel", cd.Namespace, "#_3");
            Assert.AreEqual(false, cd.HasProtectionLevel, "#_4");
            Assert.AreEqual(SessionMode.NotAllowed, cd.SessionMode, "#_5");
            Assert.AreEqual(0, cd.Behaviors.Count, "#_6");
            Assert.AreEqual(1, cd.Operations.Count, "#_7");
            OperationDescription od = cd.Operations [0];

            Assert.IsNull(od.SyncMethod, "#_8");
            Assert.IsNull(od.BeginMethod, "#_9");
            Assert.IsNull(od.EndMethod, "#_10");
            Assert.AreEqual(false, od.IsOneWay, "#_11");
            Assert.AreEqual(false, od.HasProtectionLevel, "#_12");
            Assert.AreEqual("Request", od.Name, "#_13");
            Assert.AreEqual(true, od.IsInitiating, "#_14");
            Assert.AreEqual(0, od.Behaviors.Count, "#_15");
            Assert.AreEqual(2, od.Messages.Count, "#_16");
            foreach (MessageDescription md in od.Messages)
            {
                if (md.Direction == MessageDirection.Output)
                {
                    Assert.AreEqual("*", md.Action, "#_17");
                    Assert.AreEqual(false, md.HasProtectionLevel, "#_18");
                    Assert.AreEqual(0, md.Headers.Count, "#_19");
                    Assert.AreEqual(0, md.Properties.Count, "#_20");
                    Assert.IsNull(md.MessageType, "#_21");
                    MessageBodyDescription mb = md.Body;
                    Assert.AreEqual(null, mb.WrapperName, "#_22");
                    Assert.AreEqual(null, mb.WrapperNamespace, "#_23");
                    Assert.IsNull(mb.ReturnValue, "#_24");
                    Assert.AreEqual(0, mb.Parts.Count, "#_25");
                }
                else
                {
                    Assert.AreEqual("*", md.Action, "#_17_");
                    Assert.AreEqual(false, md.HasProtectionLevel, "#_18_");
                    Assert.AreEqual(0, md.Headers.Count, "#_19_");
                    Assert.AreEqual(0, md.Properties.Count, "#_20_");
                    Assert.IsNull(md.MessageType, "#_21_");
                    MessageBodyDescription mb = md.Body;
                    Assert.AreEqual(null, mb.WrapperName, "#_22_");
                    Assert.AreEqual(null, mb.WrapperNamespace, "#_23_");
                    Assert.IsNull(mb.ReturnValue, "#_24_");
                    Assert.AreEqual(0, mb.Parts.Count, "#_25_");
                }
            }
        }
 internal MessageBodyDescription(MessageBodyDescription other)
 {
     this.WrapperName = other.WrapperName;
     this.WrapperNamespace = other.WrapperNamespace;
     this.parts = new MessagePartDescriptionCollection();
     foreach (MessagePartDescription description in other.Parts)
     {
         this.Parts.Add(description.Clone());
     }
     if (other.ReturnValue != null)
     {
         this.ReturnValue = other.ReturnValue.Clone();
     }
 }
        private MessageInfo CreateMessageInfo(DataContractFormatAttribute dataContractFormatAttribute,
                                              MessageDescription messageDescription, DataContractSerializerOperationBehavior serializerFactory)
        {
            if (messageDescription.IsUntypedMessage)
            {
                return(null);
            }

            MessageInfo messageInfo = new MessageInfo();

            MessageBodyDescription body = messageDescription.Body;

            if (body.WrapperName != null)
            {
                messageInfo.WrapperName      = AddToDictionary(body.WrapperName);
                messageInfo.WrapperNamespace = AddToDictionary(body.WrapperNamespace);
            }
            MessagePartDescriptionCollection parts = body.Parts;

            messageInfo.BodyParts = new PartInfo[parts.Count];
            for (int i = 0; i < parts.Count; i++)
            {
                messageInfo.BodyParts[i] = CreatePartInfo(parts[i], dataContractFormatAttribute.Style, serializerFactory);
            }

            if (IsValidReturnValue(messageDescription.Body.ReturnValue))
            {
                messageInfo.ReturnPart = CreatePartInfo(messageDescription.Body.ReturnValue, dataContractFormatAttribute.Style, serializerFactory);
            }

            messageInfo.HeaderDescriptionTable = new MessageHeaderDescriptionTable();
            messageInfo.HeaderParts            = new PartInfo[messageDescription.Headers.Count];
            for (int i = 0; i < messageDescription.Headers.Count; i++)
            {
                MessageHeaderDescription headerDescription = messageDescription.Headers[i];
                if (headerDescription.IsUnknownHeaderCollection)
                {
                    messageInfo.UnknownHeaderDescription = headerDescription;
                }
                else
                {
                    ValidateDataContractType(headerDescription.Type);
                    messageInfo.HeaderDescriptionTable.Add(headerDescription.Name, headerDescription.Namespace, headerDescription);
                }
                messageInfo.HeaderParts[i] = CreatePartInfo(headerDescription, OperationFormatStyle.Document, serializerFactory);
            }
            messageInfo.AnyHeaders = messageInfo.UnknownHeaderDescription != null || messageInfo.HeaderDescriptionTable.Count > 0;
            return(messageInfo);
        }
Exemple #8
0
        static void ShowMessageBody(MessageDescription message)
        {
            Console.WriteLine(message.Direction == MessageDirection.Input ?"请求消息:" : "回复消息:");
            MessageBodyDescription body = message.Body;

            Console.WriteLine("<tns:{0} xmlns:tns=\"{1}\">", body.WrapperName, body.WrapperNamespace);
            foreach (var part in body.Parts)
            {
                Console.WriteLine("\t<tns:{0}>...</tns:{0}>", part.Name);
            }
            if (null != body.ReturnValue)
            {
                Console.WriteLine("\t<tns:{0}>...</tns:{0}>",
                                  body.ReturnValue.Name);
            }
            Console.WriteLine("</tns:{0}>", body.WrapperName);
        }
Exemple #9
0
        private MessageInfo CreateMessageInfo(DataContractFormatAttribute dataContractFormatAttribute, MessageDescription messageDescription, DataContractSerializerOperationBehavior serializerFactory)
        {
            if (messageDescription.IsUntypedMessage)
            {
                return(null);
            }
            MessageInfo            info = new MessageInfo();
            MessageBodyDescription body = messageDescription.Body;

            if (body.WrapperName != null)
            {
                info.WrapperName      = base.AddToDictionary(body.WrapperName);
                info.WrapperNamespace = base.AddToDictionary(body.WrapperNamespace);
            }
            MessagePartDescriptionCollection parts = body.Parts;

            info.BodyParts = new PartInfo[parts.Count];
            for (int i = 0; i < parts.Count; i++)
            {
                info.BodyParts[i] = this.CreatePartInfo(parts[i], dataContractFormatAttribute.Style, serializerFactory);
            }
            if (OperationFormatter.IsValidReturnValue(messageDescription.Body.ReturnValue))
            {
                info.ReturnPart = this.CreatePartInfo(messageDescription.Body.ReturnValue, dataContractFormatAttribute.Style, serializerFactory);
            }
            info.HeaderDescriptionTable = new OperationFormatter.MessageHeaderDescriptionTable();
            info.HeaderParts            = new PartInfo[messageDescription.Headers.Count];
            for (int j = 0; j < messageDescription.Headers.Count; j++)
            {
                MessageHeaderDescription message = messageDescription.Headers[j];
                if (message.IsUnknownHeaderCollection)
                {
                    info.UnknownHeaderDescription = message;
                }
                else
                {
                    this.ValidateDataContractType(message.Type);
                    info.HeaderDescriptionTable.Add(message.Name, message.Namespace, message);
                }
                info.HeaderParts[j] = this.CreatePartInfo(message, OperationFormatStyle.Document, serializerFactory);
            }
            info.AnyHeaders = (info.UnknownHeaderDescription != null) || (info.HeaderDescriptionTable.Count > 0);
            return(info);
        }
Exemple #10
0
        protected void AddMessageHeader(MessageDescription message, string headerNamespace, string headerName, Type headerType)
        {
            if (message != null)
            {
                MessageBodyDescription messageBody = message.Body;
                if (messageBody != null)
                {
                    if (headerNamespace.IsEmpty())
                    {
                        if (!messageBody.WrapperNamespace.IsEmpty())
                        {
                            headerNamespace = messageBody.WrapperNamespace;
                            if (!messageBody.WrapperName.IsEmpty())
                            {
                                headerNamespace += "." + messageBody.Parts[1].Name;
                            }
                        }
                        else if (messageBody.Parts != null && messageBody.Parts.Count > 0)
                        {
                            headerNamespace = messageBody.Parts[0].Namespace;
                        }
                    }

                    if (!headerNamespace.IsEmpty())
                    {
                        MessageHeaderDescription header = (from h in message.Headers.OfType <MessageHeaderDescription>()
                                                           where h.Name.IgnoreCaseCompare(headerName) &&
                                                           h.Namespace.IgnoreCaseCompare(headerNamespace)
                                                           select h).FirstOrDefault();
                        if (header == null)
                        {
                            header = new MessageHeaderDescription(headerName, headerNamespace);
                            header.MustUnderstand = true;
                            header.MemberInfo     = headerType;
                            header.Type           = headerType;
                            header.TypedHeader    = true;
                            message.Headers.Add(header);
                        }
                    }
                }
            }
        }
Exemple #11
0
 protected static int ParamsOffset(MessageBodyDescription desc)
 {
     return(HasReturnValue(desc) ? 1 : 0);
 }
Exemple #12
0
 internal static bool HasReturnValue(MessageBodyDescription desc)
 {
     return(desc.ReturnValue != null && desc.ReturnValue.Type != typeof(void));
 }
        /// <summary>
        /// Gets the message part description
        /// </summary>
        /// <param name="messageBodyDescription">A message body description instance</param>
        /// <param name="partIndex">The message body description part index.</param>
        /// <returns>The message part description</returns>
        public static MessagePartDescription GetMessagePartDescription(MessageBodyDescription messageBodyDescription, int partIndex)
        {
            MessagePartDescription messagePartDescription = messageBodyDescription.Parts[partIndex];

            return(messagePartDescription);
        }
        /// <summary>
        /// Gets the message body description
        /// </summary>
        /// <param name="messageDescription">A message description instance</param>
        /// <returns>The message body description</returns>
        public static MessageBodyDescription GetMessageBodyDescription(MessageDescription messageDescription)
        {
            MessageBodyDescription messageBodyDescription = messageDescription.Body;

            return(messageBodyDescription);
        }
        public static void ValidateParametersContent(NativeActivityContext context, MessageDescription targetMessage, IDictionary parameters,
                                                     OperationDescription targetOperation, bool isResponse)
        {
            // The following properties can only be set via message contract. Therefore, we do not need to validate them here.
            // MessageDescription: Headers, Properties, ProtectionLevel
            // MessagePartDescription: Namespace, ProtectionLevel, Multiple, Index
            MessageBodyDescription targetMessageBody = targetMessage.Body;

            Fx.Assert(targetMessageBody != null, "MessageDescription.Body is never null!");

            if (targetMessageBody.WrapperName == null)
            {
                Constraint.AddValidationError(context, new ValidationError(SR2.UnwrappedMessageNotSupported(targetOperation.Name, targetOperation.DeclaringContract.Name)));
            }
            if (targetMessageBody.WrapperNamespace == null)
            {
                Constraint.AddValidationError(context, new ValidationError(SR2.UnwrappedMessageNotSupported(targetOperation.Name, targetOperation.DeclaringContract.Name)));
            }

            IDictionaryEnumerator iterator = parameters.GetEnumerator();
            int benchmarkIndex             = 0;
            int hitCount = 0;

            // Return value needs to be treated specially since ReceiveParametersContent does not have return value on the OM.
            bool targetHasReturnValue = isResponse && targetMessageBody.ReturnValue != null && targetMessageBody.ReturnValue.Type != TypeHelper.VoidType;

            if (targetHasReturnValue)
            {
                if (iterator.MoveNext() && (string)iterator.Key == targetMessageBody.ReturnValue.Name)
                {
                    Argument argument = (Argument)iterator.Value;
                    if (argument != null && argument.ArgumentType != targetMessageBody.ReturnValue.Type)
                    {
                        Constraint.AddValidationError(context, new ValidationError(SR2.FirstParameterDoesnotMatchTheReturnValue(argument.ArgumentType.FullName, targetMessageBody.ReturnValue.Type.FullName, targetOperation.Name, targetOperation.DeclaringContract.Name)));
                    }
                    hitCount++;
                }
                else if (parameters.Contains(targetMessageBody.ReturnValue.Name))
                {
                    Constraint.AddValidationError(context, new ValidationError(SR2.ParameterPositionMismatch(targetMessageBody.ReturnValue.Name, targetOperation.Name, targetOperation.DeclaringContract.Name, "0")));
                    hitCount++;
                }
                else
                {
                    Constraint.AddValidationError(context, new ValidationError(SR2.ReturnValueMissing(targetMessageBody.ReturnValue.Type.FullName, targetOperation.Name, targetOperation.DeclaringContract.Name)));
                }

                benchmarkIndex++;
            }

            foreach (MessagePartDescription targetPart in targetMessageBody.Parts)
            {
                if (iterator.MoveNext() && (string)iterator.Key == targetPart.Name)
                {
                    Argument argument = (Argument)iterator.Value;
                    if (argument != null && argument.ArgumentType != targetPart.Type)
                    {
                        Constraint.AddValidationError(context, new ValidationError(SR2.ParameterTypeMismatch(targetPart.Name, targetPart.Type.FullName, targetOperation.Name, targetOperation.DeclaringContract.Name)));
                    }
                    hitCount++;
                }
                else if (parameters.Contains(targetPart.Name))
                {
                    Constraint.AddValidationError(context, new ValidationError(SR2.ParameterPositionMismatch(targetPart.Name, targetOperation.Name, targetOperation.DeclaringContract.Name, benchmarkIndex)));
                    hitCount++;
                }
                else
                {
                    Constraint.AddValidationError(context, new ValidationError(SR2.MissingParameter(targetPart.Name, targetOperation.Name, targetOperation.DeclaringContract.Name)));
                }

                benchmarkIndex++;
            }

            if (hitCount != parameters.Count)
            {
                foreach (string name in parameters.Keys)
                {
                    XmlQualifiedName qName = new XmlQualifiedName(name, targetOperation.DeclaringContract.Namespace);
                    if (!targetMessageBody.Parts.Contains(qName))
                    {
                        if (!targetHasReturnValue || targetHasReturnValue && name != targetMessageBody.ReturnValue.Name)
                        {
                            Constraint.AddValidationError(context, new ValidationError(SR2.ExtraParameter(name, targetOperation.Name, targetOperation.DeclaringContract.Name)));
                        }
                    }
                }
            }
        }
Exemple #16
0
 void WriteMessagePart(
     XmlDictionaryWriter writer, MessageBodyDescription desc, MessagePartDescription partDesc, object obj)
 {
     parent.GetSerializer(partDesc).WriteObject(writer, obj);
 }