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

时间:2011-05-02 08:04:37

标签: c# asp.net mysql message-queue

在这行代码中,我收到了错误,如我所说

我将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();
        }
    }

enter image description here

enter image description here

6 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:2)

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

    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("{0}{1}", QUEUENAME_PREFIX, DEFAULT_QUEUE_NAME);
            return result;
        }
    }
   public void SendMessage()
    {
        string queuePath = QueueName;
        MessageQueue  messageQueue = MessageQueue.Create(queuePath);
        messageQueue.Send("msg");            
    }

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

答案 2 :(得分:2)

我有类似的问题。我很困惑,因为我的代码在我的本地开发机器上工作,但不在生产中。甚至更奇怪的是,队列的创建方式完全相同。

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

  

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

这对我来说是固定的,在我看来这不是问题,但你可能想要考虑为所有用户打开它的后果。

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

答案 3 :(得分:2)

我遇到了同样的问题。

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

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

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

答案 4 :(得分:1)

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

 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);

答案 5 :(得分:0)

对于那些正在努力解决这个问题并像往常一样拉扯他们头发的人,我终于找到了一些在所有投票建议都失败的情况下有用的东西。

即使您认为正确解析了目标队列的托管系统的主机名,也不相信。尝试使用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地址显然不是一个有生产价值的方案,但它确实指出了某种类型的名称解析问题,因为它可能是错误的原因。我无法解释为什么Send()有效,但当我使用主机名而不是IP时,Receive()不能,但我可以一致地重现这些结果。直到我能够弄清楚名称解析发生了什么,我不再浪费一天时间尝试从队列中读取消息。