0

这是我之前关于无法在 Windows 应用商店应用程序中删除 Expect100Continue 标头的问题的延续,供参考:ServicePoint.Expect100Continue for Windows Store Apps

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

[XmlRoot(ElementName = "myRootElement", Namespace = "myNamespace.com")]
public class MyRootElement
{
     [XmlElement(Namespace = "myNamespace.com", ElementName = "myParameter")]
     public string MyParameter { get; set; } 
}

为了序列化和构造 HttpContent 的主体,我使用这样的序列化代码:

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>";

但是输出是有缺陷的。命名空间只写在根元素上,而不写在参数元素上。有一个“?” 正文开头的字符我无法删除或找到来源。

另外我想知道是否有更好的方法,然后将字符串连接到 SOAP 信封中。

4

1 回答 1

0

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

于 2012-10-10T10:28:08.140 回答