【问题标题】:Remote MSMQ FormatName Error远程 MSMQ 格式名称错误
【发布时间】:2018-03-13 21:58:16
【问题描述】:

我在一个事务性的开发服务器上创建了一个私有队列,并试图通过 C# 向它推送消息:

using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
    //AppSetting has: FormatName:DIRECT=OS:.\private$\queue_name
    sampleQueue = new MessageQueue(System.Configuration.ConfigurationManager.AppSettings["q"]);

    var msg = new SampleMessage { CreateDate = DateTime.Now, Body = Guid.NewGuid().ToString() };

    var mess = new Message(msg);
    mess.UseDeadLetterQueue = true;
    mess.Recoverable = true;

    sampleQueue.Send(mess, MessageQueueTransactionType.Single);
    scope.Complete();
}

SampleMessage 类只公开了一组 CreateDateBody 属性 - 完全通用,因为这只是一个示例。

在我的本地环境(Windows 10 Pro)中运行代码时,我可以成功地将带有上述代码的消息放入队列中。同样,如果我在开发服务器 (Windows Server 2016) 上运行相同的代码,消息会按预期显示。

我的问题在于尝试将消息从我的本地系统放到远程队列(将 . 更改为服务器的 FQDN,它在我的 HOSTS 文件中有一个条目),这会退回 @987654327 @ 如果我尝试访问来自 sampleQueue 的任何属性(上图 - 示例属性将是 MachineName),但如果我不访问任何属性,则消息将无法传递,没有说明原因且没有错误抛出。我在消息上启用了死信(上图),但事务性和非事务性都没有显示任何失败的消息,所以我很茫然。我也试过FormatName:DIRECT=OSFormatName:DIRECT=TCP 并检查了所有的大小写,以确保它是正确的,但没有运气。另外,我确保没有检查Disable un-authenticated RPC calls,并且两台机器上的 Windows 防火墙都已关闭。

生产环境不会与 Active Directory 域相关联,因此这都是基于工作组的 MSMQ。匿名登录已启用,队列绝对是事务性的,而且由于本地工作,我很难过。

有趣的是,当我尝试发送到远程队列时,我看到了在 Outgoing Queues 中弹出的位置。我看了看,看到它显示了Connected 的状态,有 0 条消息,0 条未确认的消息和 0 条未处理的消息。它在Next Hop(s) 下显示的 IP 是正确的,因此名称解析也可以正常工作。

有什么建议吗?我试图避免要求开发人员在他们的本地机器上创建 MSMQ 队列,但现在这是我能看到的唯一选择,如果我不能让它工作。

更新

根据下面的评论,我在远程服务器上创建了一个名为 test_queue 的非事务队列,并尝试向它发送消息。它到达了目标服务器,但进入了死信消息,其中列出了 The destination queue does not exist 类。我的配置文件中的队列名称显示FormatName:DIRECT=OS:remote-server-name\private$\test_queue,它绝对是一个私有队列,所以我真的很困惑,因为队列肯定在那里。

【问题讨论】:

  • 是否启用了 msdtc?您是否有权将消息写入远程服务器上的(事务)队列?你能展示你使用的完整(可能是匿名的)格式吗?在我的公司,我们也使用 msmq,它运行良好(可以将消息写入远程服务器)。
  • 是的,在桌面和服务器上都启用了。我设置了允许匿名登录和所有人完全控制的权限,所以我不认为这些不应该参与其中。您的公司在 Active Directory 平台上是否有此功能?我怀疑这是这个问题的一部分——在工作组中。
  • 是的,我们使用活动目录。我没有其他想法如何解决这个问题。我知道一件事:当您遇到 msmq 问题时,您将陷入痛苦的世界;)。
  • 要消除事务性问题,请尝试将非事务性消息发送到远程计算机上的非事务性队列。这应该是一个容易解决的问题,因为您没有做任何花哨的事情,而且 MSMQ 在工作组模式下非常简单。还要检查您的地址是否正确。 blogs.msdn.microsoft.com/johnbreakwell/2009/02/26/…
  • @JohnBreakwell - 我根据尝试更新了问题。这绝对是基本的,所以我不知道为什么会如此挣扎。

标签: c# message-queue msmq


【解决方案1】:

知道了! MSMQ 将是我的死,我发誓。远程服务器不是域的一部分,因此为了更轻松地连接到服务器,我在我的 Active Directory 实例中创建了一个区域,例如companyname.local 然后在那里有一个 devserver.companyname.local 指向正确 IP 的条目。

当我创建非事务队列并收到消息The destination queue doesn't exist 时,我看到了这篇文章:https://social.msdn.microsoft.com/Forums/en-US/0d02f666-3f45-427e-9dbd-379435160471/the-destination-queue-does-not-exist?forum=msmq。它提到查看死信队列中消息的队列选项卡,我看到了我设置的确切 FormatName 配置,例如DIRECT=OS:devserver.companyname.local\private$\queue_name,但队列的属性显示名称为 devserver\private$\queue_name。凭直觉,并且因为 MSMQ 变化无常,我在该 IP 中添加了一个用于 devserver 的快速 HOSTS 条目(这样我就可以绕过我的 DNS 区域)并且现在可以发送到事务和非事务队列!

我不敢相信 MSMQ 会关心它是否到达了正确的服务器,但服务器名称无法像那样解析。该服务器位于托管环境中,因此无法访问我的 DNS 实例,但将其更改为原始服务器名称即可解决问题

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 2013-12-12
    • 1970-01-01
    • 2014-07-03
    • 2017-03-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多