title: SoapExtension not logging request and response
body: <p>I consume Java Web Service with my c# console client. I need to get request and response. How can I do this with SoapExtension.</p>
  
  <p>I realize TraceExtension Class like this:</p>
  
  <pre><code>using System;
  using System.IO;
  using System.Web.Services.Protocols;
  
  // Define a SOAP Extension that traces the SOAP request and SOAP 
  // response for the XML Web service method the SOAP extension is 
  // applied to. 
  
  namespace WSTracer
  {
      public class TraceExtension : SoapExtension
      {
          Stream oldStream;
          Stream newStream;
          string filename;
  
          // Save the Stream representing the SOAP request or SOAP response into 
          // a local memory buffer. 
          public override Stream ChainStream(Stream stream)
          {
              oldStream = stream;
              newStream = new MemoryStream();
              return newStream;
          }
  
          // When the SOAP extension is accessed for the first time, the XML Web 
          // service method it is applied to is accessed to store the file 
          // name passed in, using the corresponding SoapExtensionAttribute.   
          public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
          {
              return ((TraceExtensionAttribute)attribute).Filename;
          }
  
          // The SOAP extension was configured to run using a configuration file 
          // instead of an attribute applied to a specific XML Web service 
          // method. 
          public override object GetInitializer(Type WebServiceType)
          {
              // Return a file name to log the trace information to, based on the 
              // type. 
              return "C:\\" + WebServiceType.FullName + ".log";
          }
  
          // Receive the file name stored by GetInitializer and store it in a 
          // member variable for this specific instance. 
          public override void Initialize(object initializer)
          {
              filename = (string)initializer;
          }
  
          //  If the SoapMessageStage is such that the SoapRequest or 
          //  SoapResponse is still in the SOAP format to be sent or received, 
          //  save it out to a file. 
          public override void ProcessMessage(SoapMessage message)
          {
              switch (message.Stage)
              {
                  case SoapMessageStage.BeforeSerialize:
                      break;
                  case SoapMessageStage.AfterSerialize:
                      WriteOutput(message);
                      break;
                  case SoapMessageStage.BeforeDeserialize:
                      WriteInput(message);
                      break;
                  case SoapMessageStage.AfterDeserialize:
                      break;
              }
          }
  
          public void WriteOutput(SoapMessage message)
          {
              newStream.Position = 0;
              FileStream fs = new FileStream(filename, FileMode.Append,
                  FileAccess.Write);
              StreamWriter w = new StreamWriter(fs);
  
              string soapString = (message is SoapServerMessage) ? "SoapResponse" : "SoapRequest";
              w.WriteLine("-----" + soapString + " at " + DateTime.Now);
              w.Flush();
              Copy(newStream, fs);
              w.Close();
              newStream.Position = 0;
              Copy(newStream, oldStream);
          }
  
          public void WriteInput(SoapMessage message)
          {
              Copy(oldStream, newStream);
              FileStream fs = new FileStream(filename, FileMode.Append,
                  FileAccess.Write);
              StreamWriter w = new StreamWriter(fs);
  
              string soapString = (message is SoapServerMessage) ?
                  "SoapRequest" : "SoapResponse";
              w.WriteLine("-----" + soapString +
                  " at " + DateTime.Now);
              w.Flush();
              newStream.Position = 0;
              Copy(newStream, fs);
              w.Close();
              newStream.Position = 0;
          }
  
          void Copy(Stream from, Stream to)
          {
              TextReader reader = new StreamReader(from);
              TextWriter writer = new StreamWriter(to);
              writer.WriteLine(reader.ReadToEnd());
              writer.Flush();
          }
      }
  
      // Create a SoapExtensionAttribute for the SOAP Extension that can be 
      // applied to an XML Web service method.
      [AttributeUsage(AttributeTargets.Method)]
      public class TraceExtensionAttribute : SoapExtensionAttribute
      {
  
          private string filename = "c:\\log.txt";
          private int priority;
  
          public override Type ExtensionType
          {
              get { return typeof(TraceExtension); }
          }
  
          public override int Priority
          {
              get { return priority; }
              set { priority = value; }
          }
  
          public string Filename
          {
              get
              {
                  return filename;
              }
              set
              {
                  filename = value;
              }
          }
      }
  }
  </code></pre>
  
  <p>and add my app.config is:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8" ?&gt;
  &lt;configuration&gt;
      &lt;system.serviceModel&gt;
          &lt;bindings&gt;
              &lt;basicHttpBinding&gt;
                  &lt;binding name="CallerPortBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
                      receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                      bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                      useDefaultWebProxy="true"&gt;
                      &lt;readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                          maxBytesPerRead="4096" maxNameTableCharCount="16384" /&gt;
                      &lt;security mode="None"&gt;
                          &lt;transport clientCredentialType="None" proxyCredentialType="None"
                              realm="" /&gt;
                          &lt;message clientCredentialType="UserName" algorithmSuite="Default" /&gt;
                      &lt;/security&gt;
                  &lt;/binding&gt;
              &lt;/basicHttpBinding&gt;
          &lt;/bindings&gt;
          &lt;client&gt;
              &lt;endpoint address="http://192.168.5.39:7001/EisGateway/ServiceCall"
                  binding="basicHttpBinding" bindingConfiguration="CallerPortBinding"
                  contract="GNISrvRef.Caller" name="CallerPort" /&gt;
          &lt;/client&gt;
      &lt;/system.serviceModel&gt;
      &lt;system.web&gt;
          &lt;webServices&gt;
              &lt;soapExtensionTypes&gt;
                  &lt;add type="WSTracer.TraceExtension,WSTracer" priority="1" /&gt;
              &lt;/soapExtensionTypes&gt;
          &lt;/webServices&gt;
      &lt;/system.web&gt;
  &lt;/configuration&gt;
  </code></pre>
  
  <p>Can you help me?</p>