对于其他在这个问题上苦苦挣扎并像我一样拔掉头发的人,当所有推荐的建议都失败时,我终于找到了可行的方法。
即使您认为目标队列的托管系统的主机名被正确解析,也不要相信。尝试用 IP 地址替换主机名,看看它是否有效。它对我有用。我可以使用远程服务器上的主机名写入公共队列而不会出现问题,但尝试从中读取会产生针对此问题列出的错误。
例如,如果我声明以下内容:
private static string QueueName = @"FormatName:DIRECT=TCP:SOMEHOST\MyQueue";
private static System.Messaging.MessageQueue Queue = new System.Messaging.MessageQueue(QueueName);
其中“MyQueue”是服务器 SOMEHOST 上的公共队列,以下代码将成功地将消息插入队列,但在 Receive() 上总是失败:
Queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
// The Receive() call here is a blocking call. We'll wait if there is no message in the queue, and processing
// is halted until there IS a message in the queue.
//
try
{
Queue.Send("hello world", System.Messaging.MessageQueueTransactionType.Single);
var msg = Queue.Receive(MessageQueueTransactionType.Single);
}
catch (Exception ex)
{
// todo error handling
}
我指定队列位置的一个简单更改就是使 Receive() 停止失败并出现可怕的“队列不存在或您没有足够的权限”错误:
private static string QueueName = @"FormatName:DIRECT=TCP:192.168.1.100\MyQueue";
(显然我混淆了 IP 地址和其他敏感信息)。使用 IP 地址显然不是一个值得生产的场景,但它确实指出某种类型的名称解析问题可能是导致错误的原因。当我使用主机名而不是 IP 时,我无法解释为什么 Send() 有效但 Receive() 无效,但我可以一致地重现这些结果。在我弄清楚名称解析发生了什么之前,我不会再浪费一天时间尝试从队列中读取消息。