Merge pull request #145 from ngraziano/99b87f07af0beed3a887
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 2 Aug 2011 20:51:35 +0000 (13:51 -0700)
committerAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Tue, 2 Aug 2011 20:54:54 +0000 (05:54 +0900)
Fix Service Model Xml Serialization and XMLAttributes

mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/XmlMessagesFormatter.cs
mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/TypedMessageConverterTest.cs

index 2e7d672315e734e64cfd5733c6117bb92d0438b2..859dacabe687e0033579e31762b36f99bce85cbe 100644 (file)
@@ -65,6 +65,7 @@ namespace System.ServiceModel.Dispatcher
                        m.IsReturnValue = isReturnValue;
                        m.MemberName = partDesc.Name;
                        m.MemberType = partDesc.Type;
+                       m.XmlAttributes = new XmlAttributes(partDesc.MemberInfo);
                        return m;
                }
 
index eb9b672ebdf5053bd9bb95f94657a711f20d150c..63f4ba55c3ec3e7154a304f0ed0ef77b7b45cdca 100644 (file)
@@ -34,7 +34,9 @@ using System.ServiceModel;
 using System.ServiceModel.Channels;
 using System.ServiceModel.Description;
 using System.ServiceModel.Dispatcher;
+using System.Text;
 using System.Xml;
+using System.Xml.Serialization;
 using NUnit.Framework;
 
 namespace MonoTests.System.ServiceModel.Description
@@ -119,6 +121,49 @@ namespace MonoTests.System.ServiceModel.Description
                        Assert.AreEqual ("test", t2.echo.msg, "#01");
                        Assert.AreEqual ("testtest", t2.body2, "#02");
                }
+
+
+               [Test]
+               public void XmlSerializerdWithXmlAttribute()
+               {
+                       TypedMessageConverter c = TypedMessageConverter.Create (
+                               typeof (Test3), "http://tempuri.org/MyTest",
+                new XmlSerializerFormatAttribute ());
+
+
+                       string xmlMessage = @"<s:Envelope xmlns:s='http://www.w3.org/2003/05/soap-envelope'
+                                                                       xmlns:a='http://www.w3.org/2005/08/addressing'>
+                               <s:Header><a:Action s:mustUnderstand='1'>http://tempuri.org/MyTest</a:Action></s:Header>
+                               <s:Body xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
+                                       <test xmlns='urn:foo'>
+                                               <Id>OneID</Id>
+                                               <Element>
+                                                       <Prop1 xmlns='urn:bar'>foo</Prop1>
+                                                       <Prop2 xmlns='urn:bar'>2</Prop2>
+                                               </Element>
+                                               <Element>
+                                                       <Prop1 xmlns='urn:bar'>bar</Prop1>
+                                                       <Prop2 xmlns='urn:bar'>3</Prop2>
+                                               </Element>
+                                       </test>
+                               </s:Body>
+                               </s:Envelope>";
+
+                       byte[] buffer = Encoding.UTF8.GetBytes(xmlMessage);
+                       using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(buffer, XmlDictionaryReaderQuotas.Max))
+                       {
+                               Message messagedisk = Message.CreateMessage(reader, int.MaxValue, MessageVersion.Soap12);
+                               Test3 obj = c.FromMessage(messagedisk) as Test3;
+                               Assert.IsNotNull(obj);
+                               Assert.AreEqual("OneID", obj.Id);
+                               Assert.IsNotNull(obj.ArrayOfElement);
+                               Assert.AreEqual(2, obj.ArrayOfElement.Length);
+                               Assert.AreEqual("foo", obj.ArrayOfElement[0].Prop1);
+                               Assert.AreEqual(3, obj.ArrayOfElement[1].Prop2);
+                       }
+               }
+
+
        }
 
        [MessageContract (WrapperNamespace = "space", WrapperName = "MyName")]
@@ -146,4 +191,32 @@ namespace MonoTests.System.ServiceModel.Description
                [MessageBodyMember (Name = "body", Namespace = "urn:foo")]
                public Echo Body { get; set; }
        }
+
+    [MessageContract(WrapperName = "test",
+        WrapperNamespace = "urn:foo",
+        IsWrapped = true)]
+       public class Test3
+       {
+
+               [MessageBodyMember()]
+               [XmlElementAttribute()]
+               public string Id;
+
+               [MessageBodyMember()]
+               [XmlElement(Type = typeof(ElementType), ElementName = "Element")]
+               public ElementType[] ArrayOfElement;
+
+       }
+
+       [Serializable]
+       [XmlType(Namespace = "urn:bar")]
+       public class ElementType
+       {
+               [XmlElement(Order = 0)]
+               public string Prop1 { get; set; }
+
+               [XmlElement(Order = 1)]
+               public int Prop2 { get; set; }
+       }
+
 }