Reading the SOAP message headers for any set of messages can be useful when diagnosing problems. This code allows you to do just that.

To run: 

  1. Copy and paste the code into Visual Studio 2010.
  2. Add a reference to:
    1. System.ServiceModel.dll
    2. System.Runtime.Serialization.dll.

Original posting: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/fa3f4c55-5835-43f2-892f-737b4bccb598

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
  
public class MessageInspectorSample
{
    static void Main()
    {
        // This runs the whole show!
        Run();        
    }
  
    [ServiceContract] // A very simple service contract. Echo and Add.
    public interface ITest
    {
        [OperationContract]
        string Echo(string text);
        [OperationContract]
        int Add(int x, int y);
    }
  
    public class Service : ITest
    {
          
        public string Echo(string text)
        {
            return text;
        }
  
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
  
    public class MyInspector : IClientMessageInspector, IEndpointBehavior
    {
         
        // These lists store the messages for later retrieval.
        public List<string> sentMessages = new List<string>();
        public List<string> receivedMessages = new List<string>();
           
        #region IClientMessageInspector Members
        public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {
            // Save the reply to the list. 
            receivedMessages.Add(reply.ToString());
        }
  
        public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
        {
            // Save the request to the list.
            sentMessages.Add(request.ToString());
            return null;
        }
  
        #endregion
  
        #region IEndpointBehavior Members
        public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {}
  
        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            // Add this implementation to the inspectors.
            clientRuntime.MessageInspectors.Add(this);
        }
  
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {        }
  
        public void Validate(ServiceEndpoint endpoint)
        {        }
        #endregion
  
    }
    public static void Run()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
        host.Open();
        Console.WriteLine("Host opened at " + baseAddress);
  
        MyInspector inspector = new MyInspector();
        ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress));
        factory.Endpoint.Behaviors.Add(inspector);
        ITest proxy = factory.CreateChannel();
        proxy.Echo("Hello world");
        proxy.Add(123, 456);
        ((IClientChannel)proxy).Close();
        factory.Close();
        host.Close();
        Console.WriteLine("Sent messages:");
        foreach (string sent in inspector.sentMessages)
        {
            Console.WriteLine(sent);
            Console.WriteLine();
        }
  
        Console.WriteLine("*******************************************");
  
        Console.WriteLine("Received messages:");
  
        foreach (string received in inspector.receivedMessages)
        {
            Console.WriteLine(received);
            Console.WriteLine();
        }
        Console.ReadLine();
    }
}

+++++++++++++++++++++++++++++++++++++

To add complexity, use a different binding such as WSHttpBinding with different security requirements.


See Also


Other Languages

This article is also available in the following languages:

Deutsch (de-DE)