远程 MSMQ 格式名称错误

Remote MSMQ FormatName Error

我在事务性的开发服务器上创建了一个私有队列,并试图通过 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 class 仅公开了一组 CreateDateBody 属性 - 完全通用,因为这只是一个示例。

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

我的问题在于尝试将消息从我的本地系统放到远程队列(将 . 更改为服务器的 FQDN,它在我的 HOSTS 文件中有一个条目),这如果我尝试访问 sampleQueue 中的任何属性(以上示例 属性 将是 MachineName),则会返回 The specified format name does not support the requested operation. For example, a direct queue format name cannot be deleted.,但如果我不访问任何属性消息只是无法传递,没有说明原因,也没有抛出任何错误。我在消息上启用了死信(上图),但是事务性和非事务性都没有显示任何失败的消息,所以我不知所措。我还尝试了 FormatName:DIRECT=OSFormatName:DIRECT=TCP 并检查了所有的大写字母以确保它是正确的,但运气不佳。此外,我确保未选中 Disable un-authenticated RPC calls 并且两台计算机上的 Windows 防火墙均已关闭。

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

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

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

更新

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

知道了! 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 实例,但将其更改为原始服务器名称就成功了