【问题标题】:The queue does not exist or you do not have sufficient permissions to perform the operation. exception while sending message via MSMQ队列不存在或您没有足够的权限来执行该操作。通过 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 专业版

标签: .net message-queue msmq send system.messaging


【解决方案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。
猜你喜欢
  • 2011-08-16
  • 2013-08-02
  • 2014-09-24
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2018-02-02
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多