队列不存在或您没有足够的权限来执行该操作。通过 MSMQ 发送消息时出现异常

Posted

技术标签:

【中文标题】队列不存在或您没有足够的权限来执行该操作。通过 MSMQ 发送消息时出现异常【英文标题】:The queue does not exist or you do not have sufficient permissions to perform the operation. exception while sending message via MSMQ 【发布时间】:2015-05-27 08:22:53 【问题描述】:

我创建了一个函数来通过 MSMQ 发送消息,但在执行时出现异常。 下面是我的功能。

public void SendMessageToQueue(ChessQueue chessQueue)

    MessageQueue queue = null;
    Message m = null;
    if (!MessageQueue.Exists(".\\Private$\\" + chessQueue.QueueName))
    
        queue = new MessageQueue(".\\Private$\\chessqueue");
        chessQueue.Messages = new List<MessageObject>();
        chessQueue.Messages.Add(chessQueue.Message);
        queue.Formatter = new BinaryMessageFormatter();
        m = new Message();
        m.Body = chessQueue;
    
    else
    
        queue = new MessageQueue(".\\Private$\\" + chessQueue.QueueName);
        queue.Formatter = new BinaryMessageFormatter();
        m = queue.Receive();
        ChessQueue ExistingChessQueue = m.Body as ChessQueue;
        ExistingChessQueue.Messages.Add(chessQueue.Message);
        m.Body = ExistingChessQueue;
                
    queue.Send(m);
    // Getting Exception at this Line

例外:- 队列不存在或您没有足够的权限执行操作。

我也无法在计算机管理下打开消息队列的安全选项卡。 请参阅随附的屏幕截图。

我尝试在私有下手动创建消息队列,系统允许我这样做。见下文

下面是 mmc 跨度。

【问题讨论】:

您的 Windows 用户帐户配置文件似乎有问题。您是否尝试创建另一个用户帐户,然后手动创建队列?发生什么了?如果您卸载 MSMQ,重新启动并重新安装它会怎样? @Ahmedilyas:我在两台不同的机器上试过这段代码。 MSMQ 之前没有安装,我安装了它并重新启动了系统。在两台机器上仍然遇到同样的问题。 @Ahmedilyas:刚刚尝试手动创建消息队列,它允许我创建。 @Ahmedilyas:是安装问题吗?我是否还必须在我的系统中安装 AD 才能使用 MSMQ? @Ahmedilyas:好的,我不确定我在两台机器上的安装做错了什么。你能告诉我安装MSMQ的正确方法吗?我正在使用 Windows 7 专业版 【参考方案1】:
if (!MessageQueue.Exists(".\\Private$\\" + chessQueue.QueueName))

    queue = new MessageQueue(".\\Private$\\chessqueue");
    // etc..

此代码中有两个错误。第一个问题是它硬编码字符串中的队列名称,而不是使用 chessQueue.QueueName。不匹配当然是致命的。第二个问题,当然也是最关键的一个,是它实际上并没有创建队列。正确的代码应该类似于:

string name = ".\\Private$\\" + chessQueue.QueueName;
if (!MessageQueue.Exists(name))

    queue = MessageQueue.Create(name);
    // etc...

在我运行这段代码后看起来像这样,带有一个 queue.Send() 调用:

【讨论】:

感谢您指出这个愚蠢的错误。我什至没有创建队列。你之前在哪里,正在等待赏金 ;-) :P :D 现在正在创建队列,非常感谢。 但现在它卡在 m = queue.Receive();不知道为什么 好了,问题解决了,恭喜。现在您需要让它与另一个程序通信,直到队列中出现一条消息,Receive() 才会完成。通过您想与之交谈的任何程序放在那里。 消息已保存在队列中。我刚刚检查了消息中创建的 Xml。在第一个 m.Receive() 之后,消息从队列中消失。你能告诉我一些学习MSMQ的好文章吗? 用谷歌找文章,我做这个太久了,不知道什么是“好”了。样板建议是使用 WCF 代替 btw。

以上是关于队列不存在或您没有足够的权限来执行该操作。通过 MSMQ 发送消息时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

不在 NServiceBus 中自动创建队列

SQL Server 禁用所有触发器 - 找不到对象“XXXX”,因为它不存在或您没有权限

存储过程权限和执行

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

当前用户没有足够的权限来执行请求的操作 - Console Cloud Google

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