2012-08-10 48 views
2

我正在编写自定义MessageInspector,以便能够根据XSD验证传入的XML文档。 (出现这种情况的消息反序列化之前。)使用ReadSubTree()读取XML在自定义MessageInspector中失败

我得到一个异常

“ReadSubtree()只能如果读者是一个元素 节点上调用。”

在该线上调用ReadSubTree()

XmlReader bodyReader = message.GetReaderAtBodyContents().ReadSubtree(); 

下面是方法(从http://msdn.microsoft.com/en-us/library/aa717047.aspx复制)

private void ValidateMessageBody(ref System.ServiceModel.Channels.Message message, bool isRequest) 
    { 
     if (!message.IsFault) 
     { 
      XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas(); 
      XmlReader bodyReader = message.GetReaderAtBodyContents().ReadSubtree(); 
      XmlReaderSettings wrapperSettings = new XmlReaderSettings(); 
      wrapperSettings.CloseInput = true; 
      wrapperSettings.Schemas = schemaSet; 
      wrapperSettings.ValidationFlags = XmlSchemaValidationFlags.None; 
      wrapperSettings.ValidationType = ValidationType.Schema; 
      wrapperSettings.ValidationEventHandler += new ValidationEventHandler(InspectionValidationHandler); 
      XmlReader wrappedReader = XmlReader.Create(bodyReader, wrapperSettings); 

      // pull body into a memory backed writer to validate 
      this.isRequest = isRequest; 
      MemoryStream memStream = new MemoryStream(); 
      XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateBinaryWriter(memStream); 
      xdw.WriteNode(wrappedReader, false); 
      xdw.Flush(); 
      memStream.Position = 0; 
      XmlDictionaryReader xdr = XmlDictionaryReader.CreateBinaryReader(memStream, quotas); 

      // reconstruct the message with the validated body 
      Message replacedMessage = Message.CreateMessage(message.Version, null, xdr); 
      replacedMessage.Headers.CopyHeadersFrom(message.Headers); 
      replacedMessage.Properties.CopyProperties(message.Properties); 
      message = replacedMessage; 
     } 
    } 

我使用招发送代码对我的WCF服务(IIS托管)的POST请求。 content-type被设置为application/xml。

我输入XML看起来是这样的:

<Envelope xmlns="myNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="0.52"> 
<Sender id="1" email="..." /> 
    ... 
    ... 

所以,可能是什么问题呢?这些文档无助于我理解错误。我认为这个问题实际上是用GetReaderAtBodyContents()调用的。

+0

什么消息的'价值。 GetReaderAtBodyContents()。NodeType'? – carlosfigueira 2012-08-13 20:05:10

+0

该值是元素。有任何想法吗? – Anton 2012-08-14 07:16:23

回答

0

我的猜测是节点是一个空节点,由自闭标签来判断。

ReadSubTree可能抛出,因为这个异常...

你的情况,你只需要遍历的属性,基于节点名称...