Исключение очереди сообщений: очередь не существует или у вас недостаточно прав для выполнения операции - PullRequest
9 голосов
/ 02 мая 2011

В этой строке кода я получаю ошибку, как я уже говорил

Я объявил 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 ]

13 голосов
/ 02 мая 2011

Можете ли вы сначала проверить, существует ли очередь с именем «ASPNETService» в расположении ниже?

Управление компьютером -> Службы и приложения -> Очередь сообщений -> Личные очереди

3 голосов
/ 21 марта 2013

У меня была похожая проблема.Я был сбит с толку, потому что мой код работал на моей локальной машине разработки, но не на производстве.Еще более странно, что очереди создавались точно так же.

Оказывается, что IIS не имеет к ним доступа по умолчанию.Я только что открыл разрешения.

Управление компьютером -> Частные очереди -> щелкните имя очереди правой кнопкой мыши -> Свойства -> Вкладка «Безопасность» -> нажмите «Все» пользователя -> установите флажок Полный доступ / Разрешить -> нажмите кнопку ОК

Это исправило это для меня, и в моем случае это не проблема, но вы можете подумать о последствиях простого открытия его для всех пользователей.

Кроме того, я должен был сделать это во всех очередях на всех серверах.Похоже, не существует способа многократного выбора очередей или папок для одновременной установки разрешений для нескольких очередей.

2 голосов
/ 11 марта 2014

У меня была такая же проблема.

Я создал новую личную очередь и дал Полное разрешение Всем.

Но я все еще ловил «Очередь не существует или у вас недостаточно прав для выполнения операции» при попытке Send() к очереди.И я смог убедиться, что MessageQueue.Exists(".\\private$\\myqueue") возвращал true.

Перезапуск службы очереди сообщений решил мою проблему для меня.

2 голосов
/ 27 июня 2012

Я столкнулся с той же проблемой, я решил ее, используя следующий класс для создания очереди

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

Создайте очередь сообщений таким же образом для получения сообщения.

1 голос
/ 08 апреля 2014

У меня была та же проблема, и я сделал, как показано ниже, где я проверяю, существует очередь или нет.Если да, отправьте сообщение, создайте очередь, а затем отправьте сообщение

 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);
0 голосов
/ 01 марта 2017

Для тех, кто борется с этим и тянет свои волосы, как я, я наконец-то нашел что-то, что работает, когда все отклоненные предложения потерпели неудачу.

Даже если вы считаете имя хоста вашей целевой очереди хостингасистема решается правильно, не верьте .Попробуйте заменить имя хоста на IP-адрес и посмотреть, работает ли он.Это для меня.Я могу ЗАПИСАТЬ в общедоступную очередь, используя имя хоста на моем удаленном сервере без проблем, но при попытке ПРОЧИТАТЬ с него произойдет именно та ошибка, которая указана для этого вопроса.

Например, если я объявлю следующее:

private static string QueueName = @"FormatName:DIRECT=TCP:SOMEHOST\MyQueue";
private static System.Messaging.MessageQueue Queue = new System.Messaging.MessageQueue(QueueName);

Если «MyQueue» является публичной очередью на сервере SOMEHOST, следующий код успешно вставит сообщения в очередь, но всегда завершается ошибкой при получении ():

            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 () работает, а Receive () нет, когда я использую имя хоста вместо IP, но я могу последовательно воспроизводить эти результаты.Пока я не могу понять, что происходит с разрешением имен, я больше не трачу день на попытки прочитать сообщения из очереди.

...