Почему я не могу получить сообщение из своей удаленной общедоступной очереди транзакций?

Я использую C# в Windows Server 2008 и хочу получить сообщение из общедоступной очереди транзакций на другом компьютере в том же домене. Ошибка выглядит следующим образом:

System.Messaging.MessageQueueException: Cannot import the transaction.
   at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 action, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
   at System.Messaging.MessageQueue.Receive(TimeSpan timeout, MessageQueueTransactionType transactionType)
   at JobManagerLib.JobProcessor.Process(Action waitForNewMessageCallback) in C:\Dev\OtherProjects\POC\WindowsService\JobManagerSample\JobManagerLib\JobProcessor.cs:line 132

Я пробовал DTCPing, который успешен в одном направлении, но терпит неудачу в другом. Вот соответствующая часть журнала:

++++++++++++hosts      ++++++++++++
127.0.0.1       localhost
::1             localhost

08-20, 15:47:22.739-->Error(0x424) at clutil.cpp @256
08-20, 15:47:22.739-->-->OpenCluster
08-20, 15:47:22.739-->-->1060(The specified service does not exist as an installed service.)
++++++++++++++++++++++++++++++++++++++++++++++
     DTCping 1.9 Report for DEV-MSMQ2  
++++++++++++++++++++++++++++++++++++++++++++++
RPC server is ready
++++++++++++Validating Remote Computer Name++++++++++++
08-20, 15:47:26.207-->Start DTC connection test
Name Resolution:
    dev-msmq1-->192.168.22.11-->Dev-msmq1
08-20, 15:47:26.222-->Start RPC test (DEV-MSMQ2-->dev-msmq1)
RPC test failed

Кто-нибудь знает, почему это может не сработать? Брандмауэр Windows был открыт для MSDTC. Трудно найти много информации о Windows 2008 и MSMQ.

EDIT: Имена очередей: FormatName:DIRECT=OS:dev-msmq1\getmap и FormatName:DIRECT=OS:dev-msmq1\logevent. Это общедоступные транзакционные очереди, и каждый имеет разрешение на их просмотр/получение. Соответствующая часть моего кода выглядит следующим образом:

using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    using (var queue = new MessageQueue(QueueName))
    {
        queue.Formatter = new XmlMessageFormatter(new string[] { _targetParameterType });
        var message = queue.Receive(TimeOut, MessageQueueTransactionType.Automatic);
        string messageId = message.Label;

...
    }
}

Спасибо


person Dave Nichol    schedule 20.08.2009    source источник
comment
Возможно, опубликуйте свой код или конфигурацию вашей очереди. MSMQ может быть придирчив к форматированию имени очереди.   -  person Web    schedule 21.08.2009
comment
Но каковы настоящие имена? (technet.microsoft.com/en-us/library/ cc778392(WS.10).aspx). Хотя я думаю, что это связано с транзакциями. (МСДТК). Хотя никогда этим не пользовался. Прости.   -  person Noon Silk    schedule 21.08.2009
comment
Извините... здесь используются следующие имена очередей: FormatName:DIRECT=OS:dev-msmq1\SendEmail и FormatName:DIRECT=OS:dev-msmq1\LogEvent.   -  person Dave Nichol    schedule 21.08.2009


Ответы (3)


Так что я нашел решение: вообще отказаться от всего этого и перейти на использование WCF и привязки net.Msmq. Теперь связь с очередью работает нормально.

person Dave Nichol    schedule 09.10.2009

Убедитесь, что часы обеих машин синхронизированы. Я видел это раньше, когда аутентификация не удалась, потому что сервер и клиент отключились на минуту. Это произойдет, даже если очереди являются общедоступными и имеют разрешения для всех.

person Community    schedule 02.09.2009

Просто для полноты картины, пропуска через брандмауэр только MSDTC и MSMQ недостаточно при работе с IPv4:

Вам также необходимо разрешить трафик ICMP через брандмауэр (IPv6 может разрешать имена хостов независимо от брандмауэра, но ваш журнал DTCPIng указывает, что вы используете IPv4).

Я боролся с той же ошибкой, которую вы видите в DTCPing, и в моем случае оказалось, что она вызвана брандмауэром, блокирующим трафик ICMP.

person Mikkel Christensen    schedule 22.11.2009