【发布时间】: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 类只公开了一组 CreateDate 和 Body 属性 - 完全通用,因为这只是一个示例。
在我的本地环境(Windows 10 Pro)中运行代码时,我可以成功地将带有上述代码的消息放入队列中。同样,如果我在开发服务器 (Windows Server 2016) 上运行相同的代码,消息会按预期显示。
我的问题在于尝试将消息从我的本地系统放到远程队列(将 . 更改为服务器的 FQDN,它在我的 HOSTS 文件中有一个条目),这会退回 @987654327 @ 如果我尝试访问来自 sampleQueue 的任何属性(上图 - 示例属性将是 MachineName),但如果我不访问任何属性,则消息将无法传递,没有说明原因且没有错误抛出。我在消息上启用了死信(上图),但事务性和非事务性都没有显示任何失败的消息,所以我很茫然。我也试过FormatName:DIRECT=OS、FormatName: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