4

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

我已经阅读了许多建议,尤其是 John Breakwell 在MSMQ 问题上阅读远程私有队列(再次)总结的建议。

我已经做过的事情:

  • 关闭两台机器上的防火墙。
  • 确保Everyone 和AnonymousLogon 完全控制队列。(如果我取消 AnonymousLogon 访问,那么我就无法远程发送到队列,并且消息在接收机器上以“访问被拒绝”结束。)
  • 在两台机器上都允许未经身份验证的 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 返回“没有这样的对象”响应。
  • 然后与 LDAP 服务器进行一些 SASL GSS-API 加密交换
  • 然后关闭到 ldap 服务器和 Server2 的连接。

我尝试启用事件查看器 > 应用程序和服务日志 > Microsoft > Windows > MSMQ > End2End。它显示正在发送的消息,但没有说明尝试接收失败的原因。我该如何进一步调试呢?

4

3 回答 3

4

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

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

并非所有公共队列都可以显示。只能显示本地缓存的公共队列。错误:在 Active Directory 中找不到对象。

谷歌向我指出了 John Breakwell 对类似问题的回答这表明信任关系不适用于消息传递协议。

于 2012-05-22T23:56:01.150 回答
1

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

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

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

于 2012-05-22T12:28:07.587 回答
0

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

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

于 2014-10-22T04:56:50.173 回答