0

これは、WindowsストアアプリでExpect100Continueヘッダーを削除できないという以前の質問の続きです。参考までに、WindowsストアアプリのServicePoint.Expect100Continueを参照してください。

私は今、一歩下がって、HttpClientを使用してHttpContentをWebサービスに手動でPOSTしています。私は次のようなクラスを使用しています:

[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

「?」を解きました MemoryStreamをStringBuilderに置き換えることで問題が発生します。XmlRootとXmlElementsに2つの異なる名前空間を使用することで解決された場合、名前空間の問題が発生します。それは不格好で不必要に複雑に感じますが、「それは機能します」。

于 2012-10-10T10:28:08.140 に答える