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()调用的。
什么消息的'价值。 GetReaderAtBodyContents()。NodeType'? – carlosfigueira 2012-08-13 20:05:10
该值是元素。有任何想法吗? – Anton 2012-08-14 07:16:23