C# Windows应用商店应用程序中的手动SOAP序列化

C# Windows应用商店应用程序中的手动SOAP序列化,c#,serialization,windows-8,.net-4.5,windows-store-apps,C#,Serialization,Windows 8,.net 4.5,Windows Store Apps,这是我上一个问题的延续,该问题涉及无法在Windows应用商店应用程序中删除Expect100Continue标头,以供参考: 我现在退后一步,使用HttpClient手动将HttpContent发布到Web服务。我使用这样的类: [XmlRoot(ElementName = "myRootElement", Namespace = "myNamespace.com")] public class MyRootElement { [XmlElement(Namespace = "myN

这是我上一个问题的延续,该问题涉及无法在Windows应用商店应用程序中删除Expect100Continue标头,以供参考:

我现在退后一步,使用HttpClient手动将HttpContent发布到Web服务。我使用这样的类:

[XmlRoot(ElementName = "myRootElement", Namespace = "myNamespace.com")]
public class MyRootElement
{
     [XmlElement(Namespace = "myNamespace.com", ElementName = "myParameter")]
     public string MyParameter { get; set; } 
}
using (MemoryStream stream = new MemoryStream())
{
       XmlWriterSettings settings = new XmlWriterSettings();
       settings.OmitXmlDeclaration = true;
       settings.Encoding = Encoding.UTF8;
       settings.Indent = false;
       settings.NamespaceHandling = NamespaceHandling.Default;

       XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
       ns.Add("", "myNamespace.com");

       using (XmlWriter xmlWriter = XmlWriter.Create(stream, settings))
       {
           XmlSerializer ser = new XmlSerializer(input.GetType());
           ser.Serialize(xmlWriter, input, ns);
       }

       var arr = stream.ToArray();
       body = Encoding.UTF8.GetString(arr, 0, arr.Length);
   }

   var result = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
            body
            + "</s:Body></s:Envelope>";
为了序列化和构造HttpContent的主体,我使用如下序列化代码:

[XmlRoot(ElementName = "myRootElement", Namespace = "myNamespace.com")]
public class MyRootElement
{
     [XmlElement(Namespace = "myNamespace.com", ElementName = "myParameter")]
     public string MyParameter { get; set; } 
}
using (MemoryStream stream = new MemoryStream())
{
       XmlWriterSettings settings = new XmlWriterSettings();
       settings.OmitXmlDeclaration = true;
       settings.Encoding = Encoding.UTF8;
       settings.Indent = false;
       settings.NamespaceHandling = NamespaceHandling.Default;

       XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
       ns.Add("", "myNamespace.com");

       using (XmlWriter xmlWriter = XmlWriter.Create(stream, settings))
       {
           XmlSerializer ser = new XmlSerializer(input.GetType());
           ser.Serialize(xmlWriter, input, ns);
       }

       var arr = stream.ToArray();
       body = Encoding.UTF8.GetString(arr, 0, arr.Length);
   }

   var result = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
            body
            + "</s:Body></s:Envelope>";
使用(MemoryStream stream=new MemoryStream())
{
XmlWriterSettings=新的XmlWriterSettings();
settings.OmitXmlDeclaration=true;
settings.Encoding=Encoding.UTF8;
settings.Indent=false;
settings.namespaceholding=namespaceholding.Default;
XmlSerializerNamespaces ns=新的XmlSerializerNamespaces();
添加(“,”myNamespace.com“);
使用(XmlWriter=XmlWriter.Create(流,设置))
{
XmlSerializer ser=新的XmlSerializer(input.GetType());
序列化(xmlWriter,输入,ns);
}
var arr=stream.ToArray();
body=Encoding.UTF8.GetString(arr,0,arr.Length);
}
var result=“”+
身体
+ "";
然而,输出是有缺陷的。名称空间仅写入根元素,而不写入参数元素。在身体的开头有一个“?”字符,我无法删除或找到它的来源

另外,我想知道是否有比字符串合并更好的方法将主体封装在SOAP信封中。

通过使用StringBuilder替换MemoryStream解决了“?”问题。名称空间问题通过为XmlRoot和XmlElements使用两个不同的名称空间来解决。它感觉笨重和不必要的复杂,但“它工作”