无法读取远程专用队列

时间:2012-05-22 05:30:42

标签: msmq

我正在尝试让MSMQ 5在我的两台Windows Server 2008 R2虚拟机上运行。 我可以发送到本地和远程私人队列,我可以从本地私人队列中读取。 我无法从远程私人队列中读取。

我已经阅读了一些建议,特别是John Breakwell在MSMQ Issue reading remote private queues (again)总结的建议。

我已经完成的事情:

  • 关闭两台计算机上的防火墙。
  • 确保Everyone和AnonymousLogon完全控制队列。 (如果我带走AnonymousLogon访问权限,那么我无法远程发送到队列,并且消息最终会在接收计算机上显示“访问被拒绝”。)
  • 在两台机器上允许使用Nonauthenticated Rpc。
  • 在两台计算机上允许NewRemoteReadServerAllowNoneSecurityClient。

发送代码片段是:

        MessageQueue queue = new MessageQueue(queueName, false, false, QueueAccessMode.Send);
        Message msg = new Message("Blah");
        msg.UseDeadLetterQueue = true;
        msg.UseJournalQueue = true;
        queue.Send(msg, MessageQueueTransactionType.Automatic);
        queue.Close();

接收代码片段是:

   queueName = String.Format("FormatName:DIRECT=OS:{0}\\private$\\{1}",host,id);
   queue = new MessageQueue(queueName, QueueAccessMode.Receive);
   queue.ReceiveCompleted += new ReceiveCompletedEventHandler(receive);
   queue.BeginReceive();

...

    public void receive(object sender, ReceiveCompletedEventArgs e)
    {
        queue.EndReceive(e.AsyncResult);
        Console.WriteLine("Message received");
        queue.BeginReceive();
    }

我的queueName最终为FormatName:DIRECT=OS:server2\private$\TestQueue

当我在队列上调用beginReceive()时,我得到了

Exception: System.Messaging.MessageQueueException (0x80004005)
   at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
   at System.Messaging.MessageQueue.ReceiveAsync(TimeSpan timeout, CursorHandle cursorHandle, Int32 action, AsyncCallback callback, Object stateObject)
   at System.Messaging.MessageQueue.BeginReceive()

我在Server1上使用Wireshark来查看网络流量。没有发布所有细节,它似乎经历了以下阶段。 (Server1正在尝试从Server2上的队列中读取。)

  • Server1与Server2联系,并且存在NTLMSSP质询/响应协商。一些回复提到“未知结果(3),原因:超出了本地限制”。
  • Server1向Server2发送rpc__mgmt_inq_princ_name请求,Server2回复相应的响应。
  • 有一些ldap交换查找域,然后引用ldap:// domain / cn = msmq,CN = Server2,CN = Computers,DC = domain返回“no such object”响应。
  • 然后是与LDAP服务器的一些SASL GSS-API加密交换
  • 然后关闭与ldap服务器和Server2的连接。

我尝试启用事件查看器>应用程序和服务日志>微软> Windows> MSMQ>端到端。它显示正在发送的消息,但没有指示为什么尝试接收失败。 我该如何进一步调试?

3 个答案:

答案 0 :(得分:4)

问题与域有关。 Server1和Server2是开发域的一部分。我的登录帐户是公司域的一部分。开发域信任企业域足以让我登录,成为管理员,安装功能等。但是,读取远程队列似乎不够信任。

我通过调查公共队列找到了这个。如果我在阅读远程私有队列时遇到问题,也许我应该通过尝试 public 队列来获取更多数据。安装适当的目录集成功能后,我能够创建公共队列,但不能在公共队列列表中看到它。试图刷新公共队列列表给了我这个错误:

  

不是全部   可以显示公共队列。只有本地缓存​​的公共队列才可以   显示。错误:在Active Directory中找不到该对象。

谷歌向我指出John Breakwell对类似问题here的回答,这表明信任关系不能跨消息传递协议工作。

答案 1 :(得分:1)

尝试使用标准接收方法,并指定事务类型,因为 BeginReceive 似乎不支持从事务性队列接收。

Message msg = queue.Receive(MessageQueueTransactionType.Automatic);

MSMQ并不总是返回逻辑错误消息......

答案 2 :(得分:0)

System.Messaging.MessageQueueException(0x80004005) 在System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()

由于对不存在的队列的BeginReceive Read,也可能导致此错误。检查配置以确保指定的队列路径在物理上存在并且具有" Everyone"完全权限