使用ReadSubTree()读取XML在自定义MessageInspector中失败

时间:2012-08-10 15:13:26

标签: .net xml wcf

我正在编写自定义MessageInspector,以便能够根据XSD验证传入的XML文档。 (这发生在消息反序列化之前。)

我得到了一个例外

  

只有读取器位于元素上时才能调用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;
        }
    }

我正在使用Fiddler向我的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()调用。

1 个答案:

答案 0 :(得分:0)

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

ReadSubTree可能因此而引发异常...

在您的情况下,您只需要根据节点名称迭代属性...