Pergunta

Estou usando o C# no Windows Server 2008 e quero receber uma mensagem de uma fila de transações públicas em outra máquina no mesmo domínio. O erro se parece com o seguinte:

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

Eu tentei dtcping, que consegue uma direção, mas falha na outra. Aqui está a parte pertinente do log:

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

Alguém tem alguma ideia de por que isso pode estar falhando? O firewall do Windows foi aberto para o MSDTC. É difícil encontrar muitas informações sobre o Windows 2008 e o MSMQ.

EDITAR: Os nomes da fila são formatName: Direct = OS: dev-msmq1 getMap e formatName: Direct = OS: dev-msmq1 logEvent. Eles são filas públicas, transacionais, e todo mundo tem permissão para espiar/receber. A parte pertinente do meu código é a seguinte:

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;

...
    }
}

Obrigado

Foi útil?

Solução

Então, encontrei uma solução: abandonei tudo completamente e mudei para usar o WCF e a ligação net.msmq. Agora a comunicação da fila está funcionando bem.

Outras dicas

Ambas as máquinas devem estar executando o MSDTC, pois uma transação remota está em jogo.

Este artigo do blog oferece uma pequena dica ...

Como um firewall pode estar em jogo, verifique se o Port 1801 (MSMQ) está aberto nos dois lados.

Certifique -se de que os relógios de ambas as máquinas estejam sincronizados. Eu vi isso antes, onde a autenticação falhará porque o servidor e o cliente estão fora do tempo em um minuto. Isso acontecerá mesmo que as filas sejam públicas e tenham permissões em todos.

Apenas por completude, permitir apenas o MSDTC e o MSMQ através do firewall não é suficiente ao executar o IPv4:

Você também precisa deixar o tráfego do ICMP no firewall (o IPv6 pode resolver os nomes do host, independentemente do firewall, mas o seu log DTCPing indica que você está executando o IPv4).

Eu lutei com o mesmo erro que você vê no DTCping e, no meu caso, acabou sendo acionado pelo firewall bloqueando o tráfego do ICMP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top