示例#1
0
        public void CloneProducesACopyWhenPropertyDictionariesAreNotSet()
        {
            var sourceEvent = new EventData(
                new byte[] { 0x21, 0x22 },
                null,
                null,
                33334444,
                666777,
                DateTimeOffset.Parse("2015-10-27T00:00:00Z"),
                "TestKey",
                111222,
                999888,
                DateTimeOffset.Parse("2012-03-04T09:00:00Z"),
                DateTimeOffset.Parse("2003-09-27T15:00:00Z"),
                787878,
                987654);

            var clone = sourceEvent.Clone();

            Assert.That(clone, Is.Not.Null, "The clone should not be null.");
            Assert.That(GetPropertiesBackingStore(clone), Is.Null, "The user properties should be created lazily.");
            Assert.That(clone.SystemProperties, Is.SameAs(GetEmptySystemProperties()), "The system properties should be the static empty set.");
            Assert.That(clone.IsEquivalentTo(sourceEvent, false), Is.True, "The clone should be equivalent to the source event.");
            Assert.That(clone, Is.Not.SameAs(sourceEvent), "The clone should be a distinct reference.");
        }
        public void CloneProducesACopy()
        {
            var sourceEvent = new EventData(
                new byte[] { 0x21, 0x22 },
                new Dictionary <string, object> {
                { "Test", 123 }
            },
                new Dictionary <string, object> {
                { "System", "Hello" }
            },
                33334444,
                666777,
                DateTimeOffset.Parse("2015-10-27T00:00:00Z"),
                "TestKey",
                111222,
                999888,
                DateTimeOffset.Parse("2012-03-04T09:00:00Z"),
                DateTimeOffset.Parse("2003-09-27T15:00:00Z"));

            var clone = sourceEvent.Clone();

            Assert.That(clone, Is.Not.Null, "The clone should not be null.");
            Assert.That(clone.IsEquivalentTo(sourceEvent, true), Is.True, "The clone should be equivalent to the source event.");
            Assert.That(clone, Is.Not.SameAs(sourceEvent), "The clone should be a distinct reference.");
            Assert.That(object.ReferenceEquals(clone.Properties, sourceEvent.Properties), Is.False, "The clone's property bag should be a distinct reference.");
        }
示例#3
0
        public void CloneIsolatesPropertyChanges()
        {
            var sourceEvent = new EventData(
                new byte[] { 0x21, 0x22 },
                new Dictionary <string, object> {
                { "Test", 123 }
            },
                new Dictionary <string, object> {
                { "System", "Hello" }
            },
                33334444,
                666777,
                DateTimeOffset.Parse("2015-10-27T00:00:00Z"),
                "TestKey",
                111222,
                999888,
                DateTimeOffset.Parse("2012-03-04T09:00:00Z"),
                DateTimeOffset.Parse("2003-09-27T15:00:00Z"));

            var clone = sourceEvent.Clone();

            Assert.That(clone, Is.Not.Null, "The clone should not be null.");
            Assert.That(clone.IsEquivalentTo(sourceEvent, true), Is.True, "The clone should be equivalent to the source event.");

            sourceEvent.Properties["Test"] = 999;
            sourceEvent.Properties.Add("New", "thing");
            Assert.That(clone.IsEquivalentTo(sourceEvent, true), Is.False, "The clone should no longer be equivalent to the source event; user properties were changed.");
        }
 public EventData AfterReceiveMessage(EventData eventData, WriteToLogDelegate writeToLog = null)
 {
     if (eventData == null)
     {
         return null;
     }
     var stream = eventData.Clone().GetBody<Stream>();
     if (stream == null)
     {
         return null;
     }
     if (stream.CanSeek)
     {
         stream.Seek(0, SeekOrigin.Begin);
     }
     return eventData.Clone(Decompress(stream));
 } 
 public EventData BeforeSendMessage(EventData eventData, WriteToLogDelegate writeToLog = null)
 {
     if (eventData == null)
     {
         return null;
     }
     var stream = eventData.Clone().GetBodyStream();
     if (stream == null)
     {
         return null;
     }
     if (stream.CanSeek)
     {
         stream.Seek(0, SeekOrigin.Begin);
     }
     return eventData.Clone(Compress(stream));
 }
        public EventData BeforeSendMessage(EventData eventData, WriteToLogDelegate writeToLog = null)
        {
            if (eventData == null)
            {
                return(null);
            }
            var stream = eventData.Clone().GetBody <Stream>();

            if (stream == null)
            {
                return(null);
            }
            if (stream.CanSeek)
            {
                stream.Seek(0, SeekOrigin.Begin);
            }
            return(eventData.Clone(Compress(stream)));
        }
示例#7
0
        public EventData AfterReceiveMessage(EventData eventData, WriteToLogDelegate writeToLog = null)
        {
            if (eventData == null)
            {
                return(null);
            }
            var stream = eventData.Clone().GetBodyStream();

            if (stream == null)
            {
                return(null);
            }
            if (stream.CanSeek)
            {
                stream.Seek(0, SeekOrigin.Begin);
            }
            return(eventData.Clone(Decompress(stream)));
        }
        public static EventData Clone(this EventData eventData, string text)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer.Write(text);
            writer.Flush();
            var clone = eventData.Clone();

            bodyStreamPropertyInfo.SetValue(clone, stream);
            return(clone);
        }
示例#9
0
        public async Task Deserialize_creates_new_MessageId_if_property_not_set()
        {
            var       message   = fixture.Create <BlogPostCreated>();
            var       envelope  = new Envelope(message);
            EventData eventData = await sut.Serialize(envelope);

            eventData.Properties.Remove("Khala.Envelope.MessageId");

            Envelope actual = await sut.Deserialize(eventData.Clone());

            actual.MessageId.Should().NotBeEmpty();
            (await sut.Deserialize(eventData)).MessageId.Should().NotBe(actual.MessageId);
        }
示例#10
0
        public EventData AfterReceiveMessage(EventData eventData)
        {
            var stream = eventData?.Clone().GetBodyStream();

            if (stream == null)
            {
                return(null);
            }
            if (stream.CanSeek)
            {
                stream.Seek(0, SeekOrigin.Begin);
            }
            return(eventData.Clone(Decompress(stream)));
        }
示例#11
0
        public EventData BeforeSendMessage(EventData eventData)
        {
            var stream = eventData?.Clone().GetBodyStream();

            if (stream == null)
            {
                return(null);
            }
            if (stream.CanSeek)
            {
                stream.Seek(0, SeekOrigin.Begin);
            }
            return(eventData.Clone(Compress(stream)));
        }
示例#12
0
        public EventData AfterReceiveMessage(EventData eventData)
        {
            var stream = eventData?.Clone().GetBodyStream();

            if (stream == null)
            {
                return(null);
            }

            if (!stream.CanSeek)
            {
                throw new InvalidOperationException("Stream is not seekable");
            }

            stream.Seek(0, SeekOrigin.Begin);
            return(eventData.Clone(Decompress(stream)));
        }
示例#13
0
        /// <summary>
        ///   Attempts to add an event to the batch, ensuring that the size
        ///   of the batch does not exceed its maximum.
        /// </summary>
        ///
        /// <param name="eventData">The event to attempt to add to the batch.</param>
        ///
        /// <returns><c>true</c> if the event was added; otherwise, <c>false</c>.</returns>
        ///
        /// <remarks>
        ///   When an event is accepted into the batch, its content and state are frozen; any
        ///   changes made to the event will not be reflected in the batch nor will any state
        ///   transitions be reflected to the original instance.
        /// </remarks>
        ///
        /// <exception cref="InvalidOperationException">
        ///   When a batch is published, it will be locked for the duration of that operation.  During this time,
        ///   no events may be added to the batch.  Calling <c>TryAdd</c> while the batch is being published will
        ///   result in an <see cref="InvalidOperationException" /> until publishing has completed.
        /// </exception>
        ///
        public bool TryAdd(EventData eventData)
        {
            lock (SyncGuard)
            {
                AssertNotLocked();

                eventData = eventData.Clone();
                EventDataInstrumentation.InstrumentEvent(eventData, FullyQualifiedNamespace, EventHubName);

                var added = InnerBatch.TryAdd(eventData);

                if ((added) && (EventDataInstrumentation.TryExtractDiagnosticId(eventData, out string diagnosticId)))
                {
                    EventDiagnosticIdentifiers.Add(diagnosticId);
                }

                return(added);
            }
        }
示例#14
0
        public void CloneProducesACopyWhenPropertyDictionariesAreNotSet()
        {
            var sourceEvent = new EventData(
                new BinaryData(new byte[] { 0x21, 0x22 }),
                null,
                null,
                33334444,
                666777,
                DateTimeOffset.Parse("2015-10-27T00:00:00Z"),
                "TestKey",
                111222,
                999888,
                DateTimeOffset.Parse("2012-03-04T09:00:00Z"),
                DateTimeOffset.Parse("2003-09-27T15:00:00Z"),
                787878,
                987654);

            var clone = sourceEvent.Clone();

            Assert.That(clone, Is.Not.Null, "The clone should not be null.");
            Assert.That(clone.IsEquivalentTo(sourceEvent, false), Is.True, "The clone should be equivalent to the source event.");
            Assert.That(clone, Is.Not.SameAs(sourceEvent), "The clone should be a distinct reference.");
        }
示例#15
0
        static void Main(string[] args)
        {
            //Create Event Hub client
            var eventhubClient = EventHubClient.CreateFromConnectionString(connectionString, eventhubName);

            //Send 100 messages to the Event Hub
            var data = new EventData(Encoding.UTF8.GetBytes("Hello World!"));

            data.PartitionKey = "FirstPartition";
            for (int i = 0; i < 100; i++)
            {
                eventhubClient.Send(data.Clone());
            }

            //Display the distribution of messages in each parition
            var mgr    = NamespaceManager.CreateFromConnectionString(connectionString);
            var ehDesc = mgr.GetEventHub(eventhubName);

            for (int j = 0; j < ehDesc.PartitionCount; j++)
            {
                var partInfo = eventhubClient.GetPartitionRuntimeInformation(j.ToString());
                Console.WriteLine($"Partition {j} contains {partInfo.LastEnqueuedSequenceNumber} messages");
            }
        }
        /// <summary>
        /// Gets the eventData body and properties.
        /// </summary>
        /// <param name="builder">The string builder object used to accumulate the trace event data.</param>
        /// <param name="inboundMessage">The inbound event data.</param>
        public void GetMessageAndProperties(StringBuilder builder, EventData inboundMessage)
        {
            string eventDataText = null;
            Stream stream = null;

            if (inboundMessage == null)
            {
                return;
            }
            
            try
            {
                var eventDataClone = inboundMessage.Clone();
                stream = eventDataClone.GetBody<Stream>();
                if (stream != null)
                {
                    using (var reader = new StreamReader(stream))
                    {
                        eventDataText = reader.ReadToEnd();
                    }
                }
            }
            catch (Exception)
            {
                try
                {
                    if (stream != null)
                    {
                        try
                        {
                            stream.Seek(0, SeekOrigin.Begin);
                            var serializer = new CustomDataContractBinarySerializer(typeof(string));
                            eventDataText = serializer.ReadObject(stream) as string;
                        }
                        catch (Exception)
                        {
                            try
                            {
                                stream.Seek(0, SeekOrigin.Begin);
                                using (var reader = new StreamReader(stream))
                                {
                                    eventDataText = reader.ReadToEnd();
                                }
                            }
                            catch (Exception)
                            {
                                eventDataText = UnableToReadMessageBody;
                            }
                        }
                    }
                    else
                    {
                        eventDataText = UnableToReadMessageBody;
                    }
                }
                catch (Exception)
                {
                    eventDataText = UnableToReadMessageBody;
                }
            }
            builder.AppendLine();
            builder.AppendLine(ReceivedMessagePayloadHeader);
            builder.AppendLine(string.Format(MessageTextFormat, eventDataText));
            if (inboundMessage.Properties.Any())
            {
                builder.AppendLine(ReceivedMessagePropertiesHeader);
                foreach (var p in inboundMessage.Properties)
                {
                    builder.AppendLine(string.Format(MessagePropertyFormat,
                                                     p.Key,
                                                     p.Value));
                }
            }
        }
 /// <summary>
 /// Reads the content of the EventData passed as argument.
 /// </summary>
 /// <param name="eventDataToRead">The EventData to read.</param>
 /// <param name="bodyType">BodyType</param>
 /// <returns>The content of the EventData.</returns>
 public string GetMessageText(EventData eventDataToRead, out BodyType bodyType)
 {
     string eventDataText = null;
     Stream stream = null;
     bodyType = BodyType.Stream;
     if (eventDataToRead == null)
     {
         return null;
     }
     var inboundMessage = eventDataToRead.Clone();
     try
     {
         stream = inboundMessage.GetBody<Stream>();
         if (stream != null)
         {
             var element = new BinaryMessageEncodingBindingElement
             {
                 ReaderQuotas = new XmlDictionaryReaderQuotas
                 {
                     MaxArrayLength = int.MaxValue,
                     MaxBytesPerRead = int.MaxValue,
                     MaxDepth = int.MaxValue,
                     MaxNameTableCharCount = int.MaxValue,
                     MaxStringContentLength = int.MaxValue
                 }
             };
             var encoderFactory = element.CreateMessageEncoderFactory();
             var encoder = encoderFactory.Encoder;
             var stringBuilder = new StringBuilder();
             var eventData = encoder.ReadMessage(stream, MaxBufferSize);
             using (var reader = eventData.GetReaderAtBodyContents())
             {
                 // The XmlWriter is used just to indent the XML eventData
                 var settings = new XmlWriterSettings { Indent = true };
                 using (var writer = XmlWriter.Create(stringBuilder, settings))
                 {
                     writer.WriteNode(reader, true);
                 }
             }
             eventDataText = stringBuilder.ToString();
             bodyType = BodyType.Wcf;
         }
     }
     catch (Exception)
     {
         inboundMessage = eventDataToRead.Clone();
         try
         {
             stream = inboundMessage.GetBody<Stream>();
             if (stream != null)
             {
                 var element = new BinaryMessageEncodingBindingElement
                 {
                     ReaderQuotas = new XmlDictionaryReaderQuotas
                     {
                         MaxArrayLength = int.MaxValue,
                         MaxBytesPerRead = int.MaxValue,
                         MaxDepth = int.MaxValue,
                         MaxNameTableCharCount = int.MaxValue,
                         MaxStringContentLength = int.MaxValue
                     }
                 };
                 var encoderFactory = element.CreateMessageEncoderFactory();
                 var encoder = encoderFactory.Encoder;
                 var eventData = encoder.ReadMessage(stream, MaxBufferSize);
                 using (var reader = eventData.GetReaderAtBodyContents())
                 {
                     eventDataText = reader.ReadString();
                 }
                 bodyType = BodyType.Wcf;
             }
         }
         catch (Exception)
         {
             try
             {
                 if (stream != null)
                 {
                     try
                     {
                         stream.Seek(0, SeekOrigin.Begin);
                         var serializer = new CustomDataContractBinarySerializer(typeof(string));
                         eventDataText = serializer.ReadObject(stream) as string;
                         bodyType = BodyType.String;
                     }
                     catch (Exception)
                     {
                         try
                         {
                             stream.Seek(0, SeekOrigin.Begin);
                             using (var reader = new StreamReader(stream))
                             {
                                 eventDataText = reader.ReadToEnd();
                                 if (eventDataText.ToCharArray().GroupBy(c => c).
                                     Where(g => char.IsControl(g.Key) && g.Key != '\t' && g.Key != '\n' && g.Key != '\r').
                                     Select(g => g.First()).Any())
                                 {
                                     stream.Seek(0, SeekOrigin.Begin);
                                     using (var binaryReader = new BinaryReader(stream))
                                     {
                                         var bytes = binaryReader.ReadBytes((int)stream.Length);
                                         eventDataText = BitConverter.ToString(bytes).Replace('-', ' ');
                                     }
                                 }
                             }
                         }
                         catch (Exception)
                         {
                             eventDataText = UnableToReadMessageBody;
                         }
                     }
                 }
                 else
                 {
                     eventDataText = UnableToReadMessageBody;
                 }
             }
             catch (Exception)
             {
                 eventDataText = UnableToReadMessageBody;
             }
         }
     }
     return eventDataText;
 }
        ///// <summary>
        ///// This method can be used to send an event data to an event hub.
        ///// </summary>
        ///// <param name="eventHubClient">A EventHubClient object used to send messages.</param>
        ///// <param name="eventDataList">The list of messages to send.</param>
        ///// <param name="messageNumberList">The list of message numbers.</param>
        ///// <param name="taskId">The sender task id.</param>
        ///// <param name="logging">Indicates whether logging of message content and properties is enabled.</param>
        ///// <param name="verbose">Indicates whether verbose logging is enabled.</param>
        ///// <returns>Elapsed milliseconds.</returns>
        //public async Task<long> SendEventDataBatch(EventHubClient eventHubClient,
        //                                           List<EventData> eventDataList,
        //                                           List<long> messageNumberList,
        //                                           int taskId,
        //                                           bool logging,
        //                                           bool verbose)
        //{
        //    long elapsedMilliseconds = 0;

        //    if (eventHubClient == null)
        //    {
        //        throw new ArgumentNullException(EventHubClientCannotBeNull);
        //    }

        //    if (eventDataList == null || eventDataList.Count == 0)
        //    {
        //        return elapsedMilliseconds;
        //    }
        //    List<Stream> eventDataPayloadList = null;
        //    var stopwatch = new Stopwatch();
        //    var builder = new StringBuilder();
        //    try
        //    {
        //        stopwatch.Start();
        //        if (logging && verbose)
        //        {
        //            eventDataPayloadList = eventDataList.Select(e => e.Clone().GetBodyStream()).ToList();
        //        }
        //        //await eventHubClient.SendBatchAsync(eventDataList);
        //    }
        //    finally
        //    {
        //        stopwatch.Stop();
        //    }
        //    elapsedMilliseconds = stopwatch.ElapsedMilliseconds;
        //    if (logging)
        //    {
        //        for (var i = 0; i < eventDataList.Count; i++)
        //        {
        //            try
        //            {
        //                builder.AppendLine(string.Format(CultureInfo.CurrentCulture, 
        //                                                 EventDataSuccessfullySent,
        //                                                 taskId,
        //                                                 messageNumberList[i],
        //                                                 string.IsNullOrWhiteSpace(eventDataList[i].PartitionKey)
        //                                                        ? NullValue
        //                                                        : eventDataList[i].PartitionKey));
        //                if (verbose)
        //                {
        //                    builder.AppendLine(SentMessagePayloadHeader);
        //                    builder.AppendLine(string.Format(MessageTextFormat, GetMessageText(eventDataPayloadList[i])));
        //                    builder.AppendLine(SentMessagePropertiesHeader);
        //                    foreach (var p in eventDataList[i].Properties)
        //                    {
        //                        builder.AppendLine(string.Format(MessagePropertyFormat,
        //                                                         p.Key,
        //                                                         p.Value));
        //                    }
        //                }
        //            }
        //            finally
        //            {
        //                eventDataList[i].Dispose();
        //            }
        //        }
        //        var traceMessage = builder.ToString();
        //        WriteToLog(traceMessage.Substring(0, traceMessage.Length - 1));
        //    }
        //    return elapsedMilliseconds;
        //}

        /// <summary>
        /// This method can be used to send an event data to an event hub.
        /// </summary>
        /// <param name="eventHubClient">A MessageSender object used to send event datas.</param>
        /// <param name="eventData">The event data to send.</param>
        /// <param name="messageNumber">The message number.</param>
        /// <param name="taskId">The sender task id.</param>
        /// <param name="logging">Indicates whether logging of event data content and properties is enabled.</param>
        /// <param name="verbose">Indicates whether verbose logging is enabled.</param>
        /// <returns>Elapsed milliseconds.</returns>
        public async Task<long> SendEventData(EventHubClient eventHubClient,
                                              EventData eventData,
                                              long messageNumber,
                                              int taskId,
                                              bool logging,
                                              bool verbose)
        {
            long elapsedMilliseconds;
            if (eventHubClient == null)
            {
                throw new ArgumentNullException(MessageSenderCannotBeNull);
            }

            if (eventData == null)
            {
                throw new ArgumentNullException(BrokeredMessageCannotBeNull);
            }

            var stopwatch = new Stopwatch();
            Stream bodyStream = null;
            try
            {
                var builder = new StringBuilder();
                try
                {
                    if (logging && verbose)
                    {
                        bodyStream = eventData.Clone().GetBodyStream();
                    }
                    stopwatch.Start();
                    await eventHubClient.SendAsync(eventData);
                }
                finally
                {
                    stopwatch.Stop();
                }
                elapsedMilliseconds = stopwatch.ElapsedMilliseconds;
                if (logging)
                {
                    builder.AppendLine(string.Format(CultureInfo.CurrentCulture, 
                                                     EventDataSuccessfullySent,
                                                     taskId,
                                                     messageNumber,
                                                     string.IsNullOrWhiteSpace(eventData.PartitionKey) ? NullValue : eventData.PartitionKey));
                    if (verbose)
                    {
                        builder.AppendLine(SentMessagePayloadHeader);
                        builder.AppendLine(string.Format(MessageTextFormat, GetMessageText(bodyStream)));
                        if (eventData.Properties.Any())
                        {
                            builder.AppendLine(SentMessagePropertiesHeader);
                            foreach (var p in eventData.Properties)
                            {
                                builder.AppendLine(string.Format(MessagePropertyFormat,
                                                                    p.Key,
                                                                    p.Value));
                            }
                        }
                    }
                    var traceMessage = builder.ToString();
                    WriteToLog(traceMessage.Substring(0, traceMessage.Length - 1));
                }
            }
            finally
            {
                eventData.Dispose();
            }
            return elapsedMilliseconds;
        }
 private EventData LogEventData(EventDataDirection direction, EventData eventData)
 {
     try
     {
         if (eventData != null)
         {
             messageCollection.TryAdd(new Tuple<EventDataDirection, EventData>(direction, eventData.Clone()));
         }
     }
     // ReSharper disable once EmptyGeneralCatchClause
     catch (Exception)
     {
     }
     return eventData;
 }
示例#20
0
 private static EventData LogEventData(EventDataDirection direction, EventData eventData)
 {
     try
     {
         if (eventData != null)
         {
             messageCollection.TryAdd(new Tuple <EventDataDirection, EventData>(direction, eventData.Clone()));
         }
     }
     // ReSharper disable once EmptyGeneralCatchClause
     catch (Exception)
     {
     }
     return(eventData);
 }
示例#21
0
        /// <summary>
        /// Reads the content of the EventData passed as argument.
        /// </summary>
        /// <param name="eventDataToRead">The EventData to read.</param>
        /// <returns>The content of the EventData.</returns>
        public static string GetMessageText(EventData eventDataToRead)
        {
            string eventDataText = null;
            Stream stream        = null;

            if (eventDataToRead == null)
            {
                return(null);
            }
            var inboundMessage = eventDataToRead.Clone();

            try
            {
                stream = inboundMessage.GetBodyStream();
                if (stream != null)
                {
                    var element = new BinaryMessageEncodingBindingElement
                    {
                        ReaderQuotas = new XmlDictionaryReaderQuotas
                        {
                            MaxArrayLength         = int.MaxValue,
                            MaxBytesPerRead        = int.MaxValue,
                            MaxDepth               = int.MaxValue,
                            MaxNameTableCharCount  = int.MaxValue,
                            MaxStringContentLength = int.MaxValue
                        }
                    };
                    var encoderFactory = element.CreateMessageEncoderFactory();
                    var encoder        = encoderFactory.Encoder;
                    var stringBuilder  = new StringBuilder();
                    var eventData      = encoder.ReadMessage(stream, MaxBufferSize);
                    using (var reader = eventData.GetReaderAtBodyContents())
                    {
                        // The XmlWriter is used just to indent the XML eventData
                        var settings = new XmlWriterSettings {
                            Indent = true
                        };
                        using (var xmlWriter = XmlWriter.Create(stringBuilder, settings))
                        {
                            xmlWriter.WriteNode(reader, true);
                        }
                    }
                    eventDataText = stringBuilder.ToString();
                }
            }
            catch (Exception)
            {
                inboundMessage = eventDataToRead.Clone();
                try
                {
                    stream = inboundMessage.GetBodyStream();
                    if (stream != null)
                    {
                        var element = new BinaryMessageEncodingBindingElement
                        {
                            ReaderQuotas = new XmlDictionaryReaderQuotas
                            {
                                MaxArrayLength         = int.MaxValue,
                                MaxBytesPerRead        = int.MaxValue,
                                MaxDepth               = int.MaxValue,
                                MaxNameTableCharCount  = int.MaxValue,
                                MaxStringContentLength = int.MaxValue
                            }
                        };
                        var encoderFactory = element.CreateMessageEncoderFactory();
                        var encoder        = encoderFactory.Encoder;
                        var eventData      = encoder.ReadMessage(stream, MaxBufferSize);
                        using (var reader = eventData.GetReaderAtBodyContents())
                        {
                            eventDataText = reader.ReadString();
                        }
                    }
                }
                catch (Exception)
                {
                    try
                    {
                        if (stream != null)
                        {
                            try
                            {
                                stream.Seek(0, SeekOrigin.Begin);
                                var serializer = new CustomDataContractBinarySerializer(typeof(string));
                                eventDataText = serializer.ReadObject(stream) as string;
                            }
                            catch (Exception)
                            {
                                try
                                {
                                    stream.Seek(0, SeekOrigin.Begin);
                                    using (var reader = new StreamReader(stream))
                                    {
                                        eventDataText = reader.ReadToEnd();
                                        if (eventDataText.ToCharArray().GroupBy(c => c).
                                            Where(g => char.IsControl(g.Key) && g.Key != '\t' && g.Key != '\n' && g.Key != '\r').
                                            Select(g => g.First()).Any())
                                        {
                                            stream.Seek(0, SeekOrigin.Begin);
                                            using (var binaryReader = new BinaryReader(stream))
                                            {
                                                var bytes = binaryReader.ReadBytes((int)stream.Length);
                                                eventDataText = BitConverter.ToString(bytes).Replace('-', ' ');
                                            }
                                        }
                                    }
                                }
                                catch (Exception)
                                {
                                    eventDataText = UnableToReadMessageBody;
                                }
                            }
                        }
                        else
                        {
                            eventDataText = UnableToReadMessageBody;
                        }
                    }
                    catch (Exception)
                    {
                        eventDataText = UnableToReadMessageBody;
                    }
                }
            }
            return(eventDataText);
        }