private void OnMessageReceived(object sender, BrokeredMessageEventArgs args)
        {
            // NOTE: type information does not belong here. It's a responsibility 
            // of the serializer to be self-contained and put any information it 
            // might need for rehydration.
            var message = args.Message;

            object payload;
            using (var stream = message.GetBody<Stream>())
            using (var reader = new StreamReader(stream))
            {
                try
                {
                    payload = this.serializer.Deserialize(reader);
                }
                catch (SerializationException e)
                {
                    message.SafeDeadLetter(e.Message, e.ToString());
                    return;
                }
            }

            // TODO: have a better trace correlation mechanism (that is used in both the sender and receiver).
            string traceIdentifier = BuildTraceIdentifier(message);
            try
            {
                ProcessMessage(traceIdentifier, payload);
            }
            catch (Exception e)
            {
                if (args.Message.DeliveryCount > MaxProcessingRetries)
                {
                    Trace.TraceWarning("An error occurred while processing the message" + traceIdentifier + " and will be dead-lettered:\r\n{0}", e);
                    message.SafeDeadLetter(e.Message, e.ToString());
                }
                else
                {
                    Trace.TraceWarning("An error occurred while processing the message" + traceIdentifier + " and will be abandoned:\r\n{0}", e);
                    message.SafeAbandon();
                }

                return;
            }

            Trace.WriteLine("The message" + traceIdentifier + " has been processed and will be completed.");
            message.SafeComplete();
        }
 public void SaveMessage(object sender, BrokeredMessageEventArgs args)
 {
     this.eventLog.Save(args.Message.ToMessageLogEntity());
     args.Message.SafeComplete();
 }