3

ClientMessageInspectorを使用してWebサービスからの応答を変更しようとしています。ある時点でMessage、変更されたからを作成する必要がありますXMLStream。ストリームの内容は以下のとおりです。

<soapenv:Envelope xmlns:soapenv="http://env" xmlns:xsd="http://xsd" xmlns:xsi="http://xsi" xmlns:v1="http://v1">
    <soapenv:Body>
        <v1:VM>
            <SH>
                <a>aa</a>
                <b>bb</b>
            </SH>
        </v1:VM>
    </soapenv:Body>
</soapenv:Envelope>

私は以下を使用してメッセージを作成しようとします:

System.Xml.XmlReader XMLReader = System.Xml.XmlReader.Create(XMLStream);
Message ModifiedReply = System.ServiceModel.Channels.Message.CreateMessage(OriginalReply.Version, null, XMLReader);

ただし、Message.ToString()を使用してメッセージコンテンツを印刷すると、次のようになります。

<s:Envelope xmlns:s="http://env">
    <s:Header />
        <s:Body>
            ... stream ...
        </s:Body>
</s:Envelope>

「...stream...」を防ぎ、実際のXMLパーツを取得するにはどうすればよいですか?

4

1 に答える 1

3

から作成されたメッセージは、XmlReader常に...stream...本文として出力されます。リーダーは基になるXMLの前方のみのビューであるため、複数回使用することはできません。したがってToString、リーダーからデータを読み取る場合、メッセージは残りのWCFパイプラインで使用できません(エンコーダーなど、ワイヤーに書き込みます)。

メッセージ全体を本当に見たい場合は、メッセージを自分でバッファリングして、後で再作成することができます。そのためにを使用することができますMessageBuffer。また、メッセージの内容全体が本当に必要な場合は、メッセージToStringを提供する場合と提供しない場合があります。そのため、メッセージを書き出して、強制的に印刷する必要があります。

public class StackOverflow_12609525
{
    public static void Test()
    {
        string xml = @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""
            xmlns:xsd=""http://xsd""
            xmlns:xsi=""http://xsi""
            xmlns:v1=""http://v1"">
        <soapenv:Body>
            <v1:VM>
                <SH>
                    <a>aa</a>
                    <b>bb</b>
                </SH>
            </v1:VM>
        </soapenv:Body>
    </soapenv:Envelope>";
        MemoryStream XmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
        XmlReader reader = XmlReader.Create(XmlStream);
        Message originalReply = Message.CreateMessage(reader, int.MaxValue, MessageVersion.Soap11);
        Console.WriteLine(originalReply); // this shows ...stream...
        Console.WriteLine();

        XmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
        reader = XmlReader.Create(XmlStream);

        Message modifiedReply = Message.CreateMessage(reader, int.MaxValue, originalReply.Version);
        MessageBuffer buffer = modifiedReply.CreateBufferedCopy(int.MaxValue); // this consumes the message

        Message toPrint = buffer.CreateMessage();
        MemoryStream ms = new MemoryStream();
        XmlWriterSettings ws = new XmlWriterSettings
        {
            Indent = true,
            IndentChars = "  ",
            OmitXmlDeclaration = true,
            Encoding = new UTF8Encoding(false)
        };
        XmlWriter w = XmlWriter.Create(ms, ws);
        toPrint.WriteMessage(w);
        w.Flush();
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));

        modifiedReply = buffer.CreateMessage(); // need to recreate the message here
    }
}
于 2012-09-26T20:30:34.437 に答える