public interface IMessageLoggingInspector : IClientMessageInspector
{
}
public class MessageLoggingInspector : IMessageLoggingInspector
{
// AfterReceiveReply is called when the response is received.
public void AfterReceiveReply(ref Message reply, object correlationState)
{
string messageContent = CopyAndGetMessageContent(ref reply);
var message = new
{
Id = correlationState,
Response = messageContent
};
// Code to log response message goes here
}
// BeforeSendRequest is called before the request is sent. This is where the request should be logged.
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var messageContent = CopyAndGetMessageContent(ref request);
var requestId = Guid.NewGuid();
var message = new
{
Id = requestId,
Body = messageContent,
RequestDate = DateTime.UtcNow
};
// Code to log message goes here
// Whatever returned here will be the correlationState in AfterReceiveReply method above.
// You need this to track which response is correlated to a request.
return requestId;
}
private static string CopyAndGetMessageContent(ref Message request)
{
var buffer = request.CreateBufferedCopy(int.MaxValue);
// Create a copy and set it back to request
// because as soon as the request is read, you cannot read it again.
request = buffer.CreateMessage();
var originalMessage = buffer.CreateMessage();
string messageContent;
using (var stringWriter = new StringWriter())
{
using (var xmlTextWriter = new XmlTextWriter(stringWriter))
{
originalMessage.WriteMessage(xmlTextWriter);
xmlTextWriter.Flush();
xmlTextWriter.Close();
}
messageContent = stringWriter.ToString();
}
return messageContent;
}
}