我在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;
...
}
}
由于
答案 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流量。