using System; using System.Diagnostics; using System.IO; using System.Web.Services.Protocols; namespace SoapService.Client { public class LogXmlSoap : SoapExtension { private Stream oldStream; private Stream newStream; public override Stream ChainStream(Stream stream) { oldStream = stream; newStream = new MemoryStream(); return newStream; } public override Object GetInitializer(Type serviceType) { return null; } public override Object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return null; } public override void Initialize(Object initializer) { } public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.AfterDeserialize: break; case SoapMessageStage.AfterSerialize: var xmlRequest = GetSoapEnvelope(newStream); CopyStream(newStream, oldStream); Log(xmlRequest, message.Url); break; case SoapMessageStage.BeforeDeserialize: CopyStream(oldStream, newStream); var xmlResponse = GetSoapEnvelope(newStream); break; case SoapMessageStage.BeforeSerialize: message.Stream.Position = 0; break; } } private String GetSoapEnvelope(Stream stream) { stream.Position = 0; StreamReader reader = new StreamReader(stream); var result = reader.ReadToEnd(); stream.Position = 0; return result; } private void CopyStream(Stream from, Stream to) { TextReader reader = new StreamReader(from); TextWriter writer = new StreamWriter(to); writer.WriteLine(reader.ReadToEnd()); writer.Flush(); } public static void Log(String xmlSoap, String url) { Debug.WriteLine(string.Format("Url: {0}, xml: {1}", url, xmlSoap)); } } }