我在开发服务器上创建了一个私有队列,该服务器是事务性的,我正试图通过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文件中的条目) The specified format name does not support the requested operation. For example, a direct queue format name cannot be deleted.
如果我尝试访问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
的非事务性队列,并尝试向其发送消息。它到达了目标服务器,但进入了Dead-Letter消息,列出了The destination queue does not exist
类。我的配置文件中的队列名称显示为FormatName:DIRECT=OS:remote-server-name\private$\test_queue
,它肯定是一个私有队列,所以我真的很困惑,因为队列肯定在那里。
答案 0 :(得分:0)
知道了!我发誓,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。它提到在Dead-letter队列中查看消息的Queues选项卡,我看到了我设置的确切FormatName
配置,例如DIRECT=OS:devserver.companyname.local\private$\queue_name
,但队列的属性显示名称为devserver\private$\queue_name
。在预感,并且因为MSMQ是如此变化无常,我为devserver
添加了一个快速HOSTS条目到那个IP(所以我可以规避我的DNS区域)并且发送到事务和非事务队列现在都可以工作! / p>
我无法相信MSMQ关心它到达了正确的服务器,但服务器名称无法像这样解决。此服务器位于托管环境中,因此无法访问我的DNS实例,但将其更改为原始服务器名称确实很有效