2012-09-26 3 views
3

ClientMessageInspector를 사용하여 웹 서비스의 응답을 수정하려고합니다. 어떤 시점에서 수정 된 XMLStream에서 Message을 생성해야합니다. 스트림의 내용은 다음과 같습니다 :WCF에서 XML 응답 수정. 깨진 XML

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> 

<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> 

내가 사용하여 메시지를 만들려고

어떻게 "... 스트림 ..."을 방지하고 실제 XML 부분을 가져올 수 있습니까?

답변

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 
    } 
}