Распределенная транзакция MSMQ (DTC) не может импортировать транзакцию

Мне нужно получить, обработать и отправить сообщение за одну транзакцию. Поскольку MSMQ не поддерживает Transactional Remote Receive, для этого я использую DTC. Сейчас я даже не могу получить сообщение. Вот код, который я использую для этого:

string queueName = "trxwrite";
string serverName = "mqtest";

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    MessageQueue mq = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queueName));
    mq.Formatter = new XmlMessageFormatter(new[] {typeof (string)});

    Message message = mq.Receive(MessageQueueTransactionType.Automatic);
    ts.Complete();
}
  • Очередь транзакционная.
  • DTC включен на сервере mqtestи настроен для разрешения входящих и исходящих.
  • Брандмауэр настроен на разрешение всех запросов MSMQ и DTC.

Я получаю следующее сообщение об ошибке: Невозможно импортировать транзакцию. Кто-нибудь может помочь? Кроме того, как мой клиентский компьютер узнает, что он должен использовать DTC на сервере для транзакции? Не могу судить по найденным образцам...

1 ответ

Очевидно, что код DTC должен быть установлен и настроен для обеспечения доступа к сети как на клиенте, так и на сервере. Таким образом, этот фрагмент отлично работает:

string queueName = "trxwrite";
string queue2Name = "trxread";
string serverName = "mqtest";
Parallel.For(0, 300, (int i) =>
                        {
                            using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
                            {
                                MessageQueue mq = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queueName));
                                mq.Formatter = new XmlMessageFormatter(new[] { typeof(DateTime) });

                                Message message = mq.Receive(MessageQueueTransactionType.Automatic);
                                DateTime createDt = (DateTime)message.Body;

                                MessageQueue mq2 = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queue2Name));
                                mq2.Formatter = new XmlMessageFormatter(new[] { typeof(DateTime) });

                                Message messageToSend = new Message(createDt);
                                mq2.Send(messageToSend, MessageQueueTransactionType.Automatic);

                                ts.Complete();
                            }
                        });
Другие вопросы по тегам