Получить тело из сообщения WCF - PullRequest
1 голос
/ 23 мая 2011

У меня возникли проблемы с извлечением тела из сообщения wcf.Я пытаюсь реализовать инспектор сообщений WCF для проверки сообщений по схеме XSD.

Тело мыла выглядит следующим образом:

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Header xmlns="http://www.test1.com">
      <applicationID>1234</applicationID>
    </Header>
    <GetMatchRequest xmlns="http://www.tempuri.org">test</GetMatchRequest>
  </s:Body>

Проблема в том, что когда я пытаюсь получить тело, оно становится только частичнымтело сообщения.Получает только элемент заголовка, игнорирует элемент GetMatchRequest (может быть из-за нескольких пространств имен…)

Я использую следующее для получения тела сообщения:

XmlDocument bodyDoc = new XmlDocument();
bodyDoc.Load( message.GetReaderAtBodyContents().ReadSubtree());

Я также пробовал следующее:

bodyDoc.Load( message.GetReaderAtBodyContents());

Приведенный выше код приводит к ошибке - у этого документа уже есть узел 'DocumentElement'.

Может ли кто-нибудь помочь в извлечении тела из сообщения WCF?

Спасибо

1 Ответ

6 голосов
/ 23 мая 2011

Message.GetReaderAtBodyContents возвращает считыватель, расположенный не на элементе, а на его первом дочернем элементе. Обычно тело сообщения содержит только один корневой элемент, поэтому вы можете загрузить его напрямую. Но в вашем сообщении оно содержит несколько корневых элементов (Header и GetMatchRequest), поэтому, если вы хотите загрузить все тело в XmlDocument, вам нужно предоставить элемент обертки (XmlDocument может иметь только один корневой элемент). В приведенном ниже примере я использую <s:Body> в качестве элемента упаковки, но вы можете использовать все, что захотите Код просто читает тело, пока не найдет конечный элемент (</s:Body>).

    public class Post_a866abd2_bdc2_4d30_8bbc_2ce46df38dc4
    {
        public static void Test()
        {
            string xml = @"<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"">
    <Header xmlns=""http://www.test1.com"">
      <applicationID>1234</applicationID>
    </Header>
    <GetMatchRequest xmlns=""http://www.tempuri.org"">test</GetMatchRequest>
  </s:Body>
</s:Envelope>";
            Message message = Message.CreateMessage(XmlReader.Create(new StringReader(xml)), int.MaxValue, MessageVersion.Soap11);
            Console.WriteLine(message);
            XmlDocument bodyDoc = new XmlDocument();
            MemoryStream ms = new MemoryStream();
            XmlWriter w = XmlWriter.Create(ms, new XmlWriterSettings { Indent = true, IndentChars = "  ", OmitXmlDeclaration = true });
            XmlDictionaryReader bodyReader = message.GetReaderAtBodyContents();
            w.WriteStartElement("s", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
            while (bodyReader.NodeType != XmlNodeType.EndElement && bodyReader.LocalName != "Body" && bodyReader.NamespaceURI != "http://schemas.xmlsoap.org/soap/envelope/")
            {
                if (bodyReader.NodeType != XmlNodeType.Whitespace)
                {
                    w.WriteNode(bodyReader, true);
                }
                else
                {
                    bodyReader.Read(); // ignore whitespace; maintain if you want
                }
            }
            w.WriteEndElement();
            w.Flush();
            Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
            ms.Position = 0;
            XmlDocument doc = new XmlDocument();
            doc.Load(ms);
            Console.WriteLine(doc.DocumentElement.OuterXml);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...