private IncomingTransportMessage TryDeserializeTransportMessage(ServiceBrokerMessage message)
 {
     using (var stream = new MemoryStream(message.Body))
     {
         try
         {
             var  payload = FastXmlTransportMessageSerializer.Deserialize(stream);
             var  enclosedMessageTypes = payload.Headers[StandardHeaders.EnclosedMessageTypes] as string ?? "";
             Type messageType          = null;
             foreach (var typeName in enclosedMessageTypes.Split(','))
             {
                 messageType = messageMapper.GetMappedTypeFor(typeName);
                 if (messageType != null)
                 {
                     break;
                 }
             }
             if (enclosedMessageTypes == null)
             {
                 var errorMessage = "Cannot decode type: " + enclosedMessageTypes;
                 logger.Error(errorMessage);
                 throw new CannotDeserializeMessageException(errorMessage);
             }
             var decodedMessage = messageEncoder.Decode(Encoding.UTF8.GetBytes(payload.Body), messageType);
             return(new IncomingTransportMessage(message.ConversationHandle.ToString(), payload.Headers, decodedMessage));
         }
         catch (Exception e)
         {
             logger.Error(e, "Cannot deserialize transport message for message {0} from queue {1}.", message.ConversationHandle, ServiceBrokerQueue);
             throw new CannotDeserializeMessageException(e);
         }
     }
 }
Esempio n. 2
0
 private IncomingTransportMessage TryConvertTransportMessage(Message message)
 {
     try
     {
         return(FastXmlTransportMessageSerializer.Deserialize(message.Id, message.BodyStream));
     }
     catch (Exception e)
     {
         logger.Error(e, "Cannot deserialize transport message for message {0} from queue {1}.", message.Id, localQueue.QueueName);
         throw new CannotDeserializeMessageException(e);
     }
 }
        void ITransport.Send(OutgoingTransportMessage transportMessage, IEnumerable <string> destinations)
        {
            var transaction = openTransaction; // check for "ambient" transaction on current thread
            var commitAndDisposeTransaction = false;

            if (transaction == null)
            {
                transaction = BeginTransaction();
                commitAndDisposeTransaction = true;
            }

            try
            {
                transportMessage.Headers[StandardHeaders.TimeSent]           = DateTime.UtcNow.ToString("o");
                transportMessage.Headers[StandardHeaders.ReplyToAddress]     = this.ServiceBrokerService;
                transportMessage.Headers[StandardHeaders.OriginatingAddress] = this.ServiceBrokerService;

                using (var stream = new MemoryStream())
                {
                    FastXmlTransportMessageSerializer.Serialize(transportMessage, stream);
                    var messageBuffer = stream.ToArray();
                    foreach (var destination in destinations)
                    {
                        var conversationHandle = ServiceBrokerWrapper.SendOne(transaction, ServiceBrokerService, destination, ServiceBrokerContract, ServiceBrokerMessageType, messageBuffer);
#if DEBUG
                        logger.Debug(string.Format("Sending message {0} with Handle {1} to Service Named {2}.",
                                                   transportMessage.Message.GetType().AssemblyQualifiedName,
                                                   conversationHandle,
                                                   destination));
                        logger.Debug(string.Format("ToString() of the message yields: {0}\n" +
                                                   "Message headers:\n{1}",
                                                   transportMessage.Message.ToString(),
                                                   string.Join(", ", transportMessage.Headers.Select(h => h.Key + ":" + h.Value).ToArray())));
#endif
                    }
                }


                if (commitAndDisposeTransaction)
                {
                    transaction.Commit();
                }
            }
            finally
            {
                if (commitAndDisposeTransaction)
                {
                    TryDisposeTransactionAndConnection(transaction);
                }
            }
        }
 private IncomingTransportMessage TryDeserializeTransportMessage(ServiceBrokerMessage message)
 {
     using (var stream = new MemoryStream(message.Body))
     {
         try
         {
             return(FastXmlTransportMessageSerializer.Deserialize(message.ConversationHandle.ToString(), stream));
         }
         catch (Exception e)
         {
             logger.Error(e, "Cannot deserialize transport message for message {0} from queue {1}.", message.ConversationHandle, ServiceBrokerQueue);
             throw new CannotDeserializeMessageException(e);
         }
     }
 }
        string ITransport.RequestTimeoutMessage(int secondsToWait, OutgoingTransportMessage transportMessage)
        {
            var transaction = openTransaction; // check for "ambient" transaction on current thread
            var commitAndDisposeTransaction = false;

            if (transaction == null)
            {
                transaction = BeginTransaction();
                commitAndDisposeTransaction = true;
            }

            try
            {
                transportMessage.Headers[StandardHeaders.TimeSent]           = DateTime.UtcNow.ToString("o");
                transportMessage.Headers[StandardHeaders.ReplyToAddress]     = this.ServiceBrokerService;
                transportMessage.Headers[StandardHeaders.OriginatingAddress] = this.ServiceBrokerService;

                var conversationHandle = ServiceBrokerWrapper.BeginConversation(transaction, ServiceBrokerService, ServiceBrokerService);
                ServiceBrokerWrapper.BeginTimer(transaction, conversationHandle, secondsToWait);

                using (var stream = new MemoryStream())
                {
                    FastXmlTransportMessageSerializer.Serialize(transportMessage, stream);
                    var messageBuffer = stream.ToArray();
                    PushTimeoutMessage(transaction, conversationHandle, messageBuffer, secondsToWait);
                }

                if (commitAndDisposeTransaction)
                {
                    transaction.Commit();
                }

                return(conversationHandle.ToString());
            }
            finally
            {
                if (commitAndDisposeTransaction)
                {
                    TryDisposeTransactionAndConnection(transaction);
                }
            }
        }
        private IncomingTransportMessage TryLoadDialogTimerTimeoutMessage(SqlTransaction transaction, ServiceBrokerMessage message)
        {
            var messageBuffer = PopTimeoutMessage(transaction, message.ConversationHandle);

            if (messageBuffer == null || messageBuffer.Length == 0)
            {
                var errorMessage = string.Format("Cannot deserialize transport message. DialogTimer TimeoutMessage is missing for for message {0} from queue {1}.", message.ConversationHandle, ServiceBrokerQueue);
                logger.Error(errorMessage);
                throw new CannotDeserializeMessageException(errorMessage);
            }
            using (var stream = new MemoryStream(messageBuffer))
            {
                try
                {
                    return(FastXmlTransportMessageSerializer.Deserialize(message.ConversationHandle.ToString(), stream));
                }
                catch (Exception e)
                {
                    logger.Error(e, "Cannot deserialize transport message for message {0} from queue {1}.", message.ConversationHandle, ServiceBrokerQueue);
                    throw new CannotDeserializeMessageException(e);
                }
            }
        }
Esempio n. 7
0
        public void Send(OutgoingTransportMessage transportMessage, IEnumerable <string> destinations)
        {
            var transaction = openTransaction; // check for "ambient" transaction on current thread
            var commitAndDisposeTransaction = false;

            if (transaction == null)
            {
                transaction = new MessageQueueTransaction();
                transaction.Begin();
                commitAndDisposeTransaction = true;
            }
            try
            {
                using (var stream = new MemoryStream())
                {
                    var message = new Message();
                    FastXmlTransportMessageSerializer.Serialize(transportMessage, stream);
                    stream.Position       = 0;
                    message.BodyStream    = stream;
                    message.Recoverable   = true;
                    message.ResponseQueue = new MessageQueue(MsmqUtilities.GetFullPath(InputQueue));

                    localQueue.Send(message, transaction);
                }
                if (commitAndDisposeTransaction)
                {
                    transaction.Commit();
                }
            }
            finally
            {
                if (commitAndDisposeTransaction)
                {
                    TryDisposeTransaction(transaction);
                }
            }
        }
        public void Send(OutgoingTransportMessage transportMessage, IEnumerable <string> addresses)
        {
            var transaction = SqlServerTransactionManager.TryGetTransactionForCurrentTask();
            var commitAndDisposeTransaction = false;

            if (transaction == null)
            {
                transaction = SqlServerTransactionManager.BeginTransaction(ConnectionString);
                commitAndDisposeTransaction = true;
            }
            try
            {
                transportMessage.Headers[StandardHeaders.TimeSent] = DateTime.UtcNow.ToString("o");
                if (!transportMessage.Headers.ContainsKey(StandardHeaders.ReplyToAddress))
                {
                    transportMessage.Headers[StandardHeaders.ReplyToAddress] = this.ServiceBrokerSendingService;
                }
                transportMessage.Headers[StandardHeaders.OriginatingAddress]   = this.ServiceBrokerSendingService;
                transportMessage.Headers[StandardHeaders.ContentType]          = messageEncoder.ContentType;
                transportMessage.Headers[StandardHeaders.EnclosedMessageTypes] = string.Join(",", messageMapper.GetEnclosedMessageTypes(transportMessage.Message.GetType()).Distinct());

                using (var stream = new MemoryStream())
                {
                    var encodedMessage = messageEncoder.EncodeAsString(transportMessage.Message);
                    FastXmlTransportMessageSerializer.Serialize(transportMessage.Headers, encodedMessage, stream);
                    var messageBuffer = stream.ToArray();
                    foreach (var destination in addresses)
                    {
                        var conversationHandle = ServiceBrokerWrapper.SendOne(
                            transaction: transaction
                            , initiatorServiceName: ServiceBrokerSendingService
                            , targetServiceName: destination
                            , messageContractName: ServiceBrokerContract
                            , messageType: ServiceBrokerMessageType
                            , body: messageBuffer);
#if DEBUG
                        logger.Debug(string.Format("Sending message {0} with Handle {1} to Service Named {2}.",
                                                   transportMessage.Message.GetType().AssemblyQualifiedName,
                                                   conversationHandle,
                                                   destination));
                        logger.Debug(string.Format("ToString() of the message yields: {0}\n" +
                                                   "Message headers:\n{1}",
                                                   transportMessage.Message.ToString(),
                                                   string.Join(", ", transportMessage.Headers.Select(h => h.Key + ":" + h.Value).ToArray())));
#endif
                    }
                }

                if (commitAndDisposeTransaction)
                {
                    SqlServerTransactionManager.CommitTransactionAndDisposeConnection(transaction);
                }
            }
            catch (Exception)
            {
                if (commitAndDisposeTransaction)
                {
                    SqlServerTransactionManager.TryForceDisposeTransactionAndConnection(transaction);
                }
                throw;
            }
        }