Por que não posso receber uma mensagem da minha fila transacional remota?
-
19-09-2019 - |
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
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.