Pregunta

Estoy usando C # en Windows Server 2008, y quiero recibir un mensaje de una cola transaccional pública en otra máquina en el mismo dominio. El error es el siguiente:

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

He intentado DTCPing, que tiene éxito en una dirección pero no en la otra. Aquí está la parte pertinente del registro:

++++++++++++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

¿Alguien tiene alguna idea de por qué esto podría estar fallando? El Firewall de Windows se ha abierto para MSDTC. Es difícil encontrar mucha información sobre Windows 2008 y MSMQ.

Editar : Los nombres de las colas son FormatName: OS = DIRECTO: dev-msmq1 \ GetMap y FormatName: OS = DIRECTO: dev-msmq1 \ logevent. Son, colas públicas transaccionales, y cada uno tiene peek / recibir el permiso de ellos. La parte pertinente de mi código es el siguiente:

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;

...
    }
}

Gracias

¿Fue útil?

Solución

Así que lo hice encontrar una solución: abandonar todo el asunto por completo y pasar a utilizar WCF y la unión net.Msmq. Ahora, la comunicación de colas está trabajando muy bien.

Otros consejos

Las dos máquinas deben ejecutar MSDTC ya que dicha operación remota está en juego.

Este artículo en el blog ofrece una pequeña pista ...

Desde un servidor de seguridad puede estar en juego, asegúrese de que el puerto 1801 (MSMQ) está abierto en ambos lados.

Asegúrese de que, los relojes de ambas máquinas están sincronizados. He visto esto antes, donde la autenticación fallará porque el servidor y el cliente están fuera de tiempo por un minuto. Esto ocurrirá incluso si las colas son públicos y tienen permisos en todo el mundo.

Sólo por completo, permitiendo sólo MSDTC y MSMQ a través del firewall no es suficiente cuando se ejecuta IPv4:

Hay que dejar que el tráfico ICMP a través del firewall, así (IPv6 puede resolver nombres de host, independientemente del servidor de seguridad, pero su registro DTCPing indica que se está ejecutando IPv4).

He luchado con el mismo error que se ve en DTCPing, y en mi caso resultó ser provocada por el bloqueo del tráfico ICMP del cortafuegos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top