消息队列异常:队列不存在或您没有足够的权限执行操作

Posted

技术标签:

【中文标题】消息队列异常:队列不存在或您没有足够的权限执行操作【英文标题】:Message Queue Exception : Queue does not exist or you do not have sufficient permissions to perform the operation 【发布时间】:2011-08-16 19:46:20 【问题描述】:

在这行代码中,我收到了我提到的错误

我将 MSMQ_NAME 声明为字符串,如下所示

  private const string MSMQ_NAME = ".\\private$\\ASPNETService";

    private void DoSomeMSMQStuff()
    
        using (MessageQueue queue = new MessageQueue(MSMQ_NAME))
        
            queue.Send(DateTime.Now); //Exception raises
            queue.Close();
        
    

【问题讨论】:

在计算机管理队列面板中,所有队列文件夹都是重复的!!!你的机器有点奇怪。 【参考方案1】:

您能否先验证以下位置是否存在名为“ASPNETService”的队列?

计算机管理 -> 服务和应用程序 -> 消息队列 -> 私有队列

【讨论】:

双击打开“消息队列”能否验证“ASPNETService”是否存在? 在“Private Quweues”文件夹中,您应该看到“ASPNETService”文件夹。如果没有,您可以通过 Private Queues 文件夹中的上下文菜单创建。 @Dorababu,展开消息队列节点,然后是私有队列子节点,看看你的队列是否存在。如果队列存在,则问题可能与队列的访问权限有关,您可以通过右键单击 -> 属性 -> 安全选项卡进行修改。【参考方案2】:

我遇到了类似的问题。我很困惑,因为我的代码可以在本地开发机器上运行,但不能在生产环境中运行。更奇怪的是,队列的创建方式完全相同。

事实证明,默认情况下 IIS 无权访问它们。我刚刚打开了权限。

计算机管理 -> 私有队列 -> 右键单击​​队列名称 -> 属性 -> 安全选项卡 -> 单击“所有人”用户 -> 单击完全控制/允许复选框 -> 单击确定

这为我解决了这个问题,在我的情况下这不是问题,但您可能需要考虑为所有用户开放它的后果。

此外,我必须在所有服务器上的所有队列中执行此操作。似乎没有一种方法可以多选队列或文件夹以同时为多个队列设置权限。

【讨论】:

【参考方案3】:

我遇到了同样的问题。

我创建了一个新的私人队列,并为每个人提供了完全权限。

但是当我尝试Send() 到队列时,我仍然遇到“队列不存在或您没有足够的权限来执行操作”。而且我能够验证MessageQueue.Exists(".\\private$\\myqueue") 正在返回true

重新启动消息队列服务为我解决了问题。

【讨论】:

【参考方案4】:

我遇到了同样的问题,我已经使用以下类创建队列解决了它

    private MessageQueue messageQueue;
    public const string DEFAULT_QUEUE_NAME = "newQueue";
    public const string QUEUENAME_PREFIX = ".\\Private$\\";

    public static string QueueName
    
        get
        
            string result = string.Format("01", QUEUENAME_PREFIX, DEFAULT_QUEUE_NAME);
            return result;
        
    
   public void SendMessage()
    
        string queuePath = QueueName;
        MessageQueue  messageQueue = MessageQueue.Create(queuePath);
        messageQueue.Send("msg");            
    

以相同的方式创建消息队列以接收消息。

【讨论】:

【参考方案5】:

我遇到了同样的问题,我确实喜欢在下面检查队列是否存在。如果是则发送消息,否则创建队列然后发送消息

 MessageQueue msgQueue = null;
        string queuePath = ".\\Private$\\billpay";

        Payment newPayment = new Payment()
        
            Payee = txtPayee.Text,
            Payor = txtPayor.Text,
            Amount = Convert.ToInt32(txtAmount.Text),
            DueDate = dpDueDate.SelectedDate.Value.ToShortDateString()
        ;

        Message msg = new Message();
        msg.Body = newPayment;
        msg.Label = "Gopala - Learning Message Queue";


        if (MessageQueue.Exists(queuePath) == false)
        
            //Queue doesnot exist so create it
            msgQueue = MessageQueue.Create(queuePath);
        
        else
        
            msgQueue = new MessageQueue(queuePath);
                    
        msgQueue.Send(msg);

【讨论】:

【参考方案6】:

对于其他在这个问题上苦苦挣扎并像我一样拔掉头发的人,当所有推荐的建议都失败时,我终于找到了可行的方法。

即使您认为目标队列的托管系统的主机名被正确解析,也不要相信。尝试用 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() 无效,但我可以一致地重现这些结果。在我弄清楚名称解析发生了什么之前,我不会再浪费一天时间尝试从队列中读取消息。

【讨论】:

你解决过这个问题吗?我们有一个场景,使用 PC 的真实姓名有效。知识产权有效。但是使用别名(例如通过主机文件)不起作用。

以上是关于消息队列异常:队列不存在或您没有足够的权限执行操作的主要内容,如果未能解决你的问题,请参考以下文章

不在 NServiceBus 中自动创建队列

关于消息队列速率的解决方案

无法绑定到 8080 端口。它可能被另一个应用程序占用或您没有足够的权限

如果队列不存在,则消息丢失

找不到 CREDENTIAL '<db_scoped_creds>',因为它不存在或您没有权限

找不到对象“TABLE”,因为它不存在或您没有权限