为什么我无法从远程公共事务队列中收到消息?

时间:2009-08-20 20:05:57

标签: c# msmq msdtc windows-server-2008-r2

我在Windows Server 2008上使用C#,我希望从同一域中另一台机器上的公共事务队列接收消息。错误如下所示:

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

有人知道为什么会失败吗?已为MSDTC打开Windows防火墙。很难找到关于Windows 2008和MSMQ的更多信息。

编辑:队列名称为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;

...
    }
}

由于

4 个答案:

答案 0 :(得分:1)

所以我确实找到了一个解决方案:完全放弃整个过程并切换到使用WCF和net.Msmq绑定。现在队列通信工作正常。

答案 1 :(得分:0)

由于正在进行远程交易,两台机器都必须运行MSDTC。

This blog article offers a tiny hint...

由于防火墙可能正在运行,请确保端口1801(MSMQ)双方都打开。

答案 2 :(得分:0)

确保两台机器的时钟同步。我之前看到过这种情况,认证失败的原因是服务器和客户端的关机时间是一分钟。即使队列是公共的并且对每个人都拥有权限,也会发生这种情况。

答案 3 :(得分:0)

为了完整起见,在运行IPv4时仅允许MSDTC和MSMQ通过防火墙是不够的:

您还需要让ICMP流量通过防火墙(无论防火墙如何,IPv6都可以解析主机名,但您的DTCPIng日志表明您正在运行IPv4)。

我一直在努力解决您在DTCPing中看到的同样错误,而在我的情况下,结果是防火墙阻止了ICMP流量。