2

XSDに従って受信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;
        }
    }

Fiddlerを使用してPOSTリクエストをWCFサービス(IISホスト)に送信しています。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()呼び出しにあると思います。

4

1 に答える 1

0

自己終了タグから判断すると、ノードは空のノードであると思います。

このため、ReadSubTree は例外をスローする可能性があります...

あなたの場合、ノード名に基づいて、属性を反復処理する必要があります...

于 2013-09-19T09:45:27.980 に答える