ошибка при проверке тела сообщения - PullRequest
0 голосов
/ 02 мая 2011

Я пытаюсь проверить тело сообщения wc и получаю исключение

"Вызов метода 'ValidateEndElement' не соответствует соответствующему вызову метода 'ValidateElement'."

using (MessageBuffer messageBuffer = message.CreateBufferedCopy(int.MaxValue))
{
      Message copiedMessage = messageBuffer.CreateMessage();
      using (var xreader = XmlReader.Create(
            copiedMessage.GetReaderAtBodyContents(), xmlReaderSettings))
      {
          while (xreader.Read()) ;
      }
            message = messageBuffer.CreateMessage();
}

XmlSchemaSet и настройки считывателя загружаются отдельным методом

        xmlReaderSettings = new XmlReaderSettings
           {
               ValidationType = ValidationType.Schema,
               Schemas = this.xmlSchemaSet,
               ConformanceLevel = ConformanceLevel.Auto
           };

        xmlReaderSettings.ValidationEventHandler += (o, e) =>
        {
            if (e.Severity == XmlSeverityType.Error)
                throw new ContractXmlSchemaValidationException(e.Message);
        };

Для создания сообщения wcf (где переменная messageBody содержит тело xml)

Message  msg = null;
var reader = XmlReader.Create(new StringReader(messageBody));
msg = Message.CreateMessage(MessageVersion.Soap12, "http://mysoapAction", reader);
msg.Headers.Add(MessageHeader.CreateHeader("To", "http://schemas.microsoft.com/ws/2005/05/addressing/none", "http://localhost/Service/Service1.svc"));

Ответы [ 3 ]

0 голосов
/ 07 октября 2011

просто используйте: GetReaderAtBodyContents().ReadSubtree() вы получите читателя, который просто читает тело.

РЕДАКТИРОВАТЬ:

Я использовал его для проверки моего запроса.Потому что наш удивительный WebSphere отправляет только «HTTP 500 Internal Server Error» - Ошибка, если xml недействителен.

var settings = new XmlReaderSettings();

settings.Schemas.Add(_schemas);
settings.CloseInput = true;
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags = XmlSchemaValidationFlags.AllowXmlAttributes
                         | XmlSchemaValidationFlags.ProcessInlineSchema
                         | XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += ValidationEventHandler;


using (XmlDictionaryReader bodyReader = message.GetReaderAtBodyContents())
using (XmlReader documentReader = XmlReader.Create(bodyReader.ReadSubtree(), settings))
{
    documentReader.MoveToContent();

    using (var memory = new MemoryStream())
    //copy & validate in one step :)    
    using (XmlWriter writer = XmlWriter.Create(memory))
    {
        writer.WriteNode(documentReader, false);
        writer.Flush();
    }
#if DEBUG    
    memory.Seek(0, SeekOrigin.Begin);
    string xml = new StreamReader(memory).ReadToEnd();
#endif
    memory.Seek(0, SeekOrigin.Begin);

    message = Message.CreateMessage(message.Version, null, XmlReader.Create(memory));
    message.Headers.CopyHeadersFrom(message);
}
0 голосов
/ 22 октября 2014

В своем ответе @masty пропустил регистр с самозакрывающимися тегами.Должно быть:

int startDepth = xreader.Depth;                    
while (xreader.Read())
{                       
  if (xreader.Depth == startDepth && (xreader.IsEmptyElement || xreader.NodeType == XmlNodeType.EndElement))
   {
      break;
   }
}
0 голосов
/ 30 июня 2011

Когда вы вызываете GetReaderAtBodyContents (), он делает именно это: получает Reader для всего сообщения, начиная с содержимого Body.Когда вы достигаете конца содержимого вашего тела, xreader.Read () продолжает читать остальную часть сообщения и нажимает на закрывающий тег для тела.Вам нужно изменить цикл while, чтобы не дать читателю поразить это.Попробуйте это:

int startDepth = xreader.Depth;

while (xreader.Read())
{
    if (xreader.Depth == startDepth && xreader.NodeType == XmlNodeType.EndElement)
    {
        break;
    }
}

Если есть более элегантный способ сделать это, пожалуйста, поделитесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...