0

所以遇到了这个奇怪的问题。我正在尝试从未经身份验证的事务性 msmq 接收消息。我的环境是:

  • 队列为 Windows Server 2012 R2 的服务器。这也是数据库服务器(SQL Server)
  • 安装客户端应用程序的服务器也是 Windows Server 2012 R2

我正在尝试将消息从 SQL Server 发送到 MSMQ(工作正常)。但是当客户端应用程序尝试使用下面的代码接收消息时,它会抛出我在标题中提到的错误。

private void OnPeekCompleted(object sender, PeekCompletedEventArgs args)
     {
         MessageQueue mq = (MessageQueue)sender;
         if (mq != null)
         {
             try
             {
                 if (Log.IsInfoEnabled)
                 {
                     Log.InfoFormat("[{0}] Starting processing message queue {1}", _endpoint.RouteName, _queue.QueueName);
                 }
                 mq.EndPeek(args.AsyncResult);
                 MessageQueueTransaction transaction = new MessageQueueTransaction();
                 transaction.Begin();
                 Message message = mq.Receive(transaction);
                 ... // omitted for simplicity

我无法从数据库服务器访问客户端服务器,因此我需要在同一数据库服务器上拥有消息队列,因为我从 SQL 将消息发送到队列

我检查了以下内容:

  1. 从 SQL 发送消息没有问题
  2. 服务器之间没有 n/w 可访问性问题
  3. 在消息队列服务器安全属性中启用未经身份验证的 RPC 调用
  4. 队列格式正确。我正在使用直接操作系统格式。也尝试过使用 TCP 格式指定 IP 地址而不是机器名

但无济于事。有任何想法吗?

谢谢

4

1 回答 1

0

如果这之前有效并且停止工作,您的问题几乎可以肯定是由于发送方或接收方的 DTC 更改、防火墙更改或两者兼而有之。

根据本指南,您可能需要:

...配置队列计算机和客户端计算机以启用网络 DTC 访问。

...配置 Windows 防火墙以将 MS DTC 添加到例外列表中。

如果这从未奏效,那么它可能是其他几个问题之一,但正如此处所述,远程读取“不是最佳消息传递模型的一部分”,即 MSMQ 采用的最佳范式是远程发送、本地读取。考虑更改您的架构以不使用远程读取。

于 2017-02-06T16:45:35.927 回答