这是我之前关于无法在 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 信封中。